У меня есть список объектов в Python, и каждый из них имеет свойство id
. Я хочу получить список этих идентификаторов.Python эквивалент C# .Выбрать?
В C# я бы написать
myObjects.Select(obj => obj.id);
Как бы я сделать это в Python?
У меня есть список объектов в Python, и каждый из них имеет свойство id
. Я хочу получить список этих идентификаторов.Python эквивалент C# .Выбрать?
В C# я бы написать
myObjects.Select(obj => obj.id);
Как бы я сделать это в Python?
[obj.id for obj in myObjects]
Заканчивать раздела «Список Понимания» здесь: http://docs.python.org/tutorial/datastructures.html
Если ваш начальный список называется original_list
и ваш новый список называется id_list
, вы могли бы сделать что-то вроде этого:
id_list = [x.id for x in original_list]
Если это большой список, и вам нужно только обработать идентификаторы один раз, тогда есть также выражения генератора.
ids = (obj.id for obj in my_objects)
for id in ids:
do_something(id)
Выражение генератора не поддерживает произвольный доступ, но получит Вас каждый идентификатор по требованию и так избегает создания списка всех сразу. выражений генератора: xrange
в виде списка представляют собой range
.
Еще одно предостережение с выражением генератора состоит в том, что доступ к нему возможен только до тех пор, пока любой ресурс внутри него все еще открыт. Например, следующий код не будет выполнен.
with open(filename) as f:
lines = (line for line in f)
# f is now closed
for line in lines:
print line
В этом случае работа с эквивалентным списком будет работать.
Никто в здравом уме не будет делать это следующим образом, но здесь это в случае, если это пригодится в более сложном примере
import operator
map(operator.attrgetter("id"), myObjects)
Если вы хотите прямой эквивалент C# выберите в Python, за счет использования сторонней библиотеки, вы можете использовать пакет asq, который предоставляет встроенную реализацию LINQ для объектов поверх итераций Python. Использование ASQ кода C# в вашем вопросе станет:
from asq.initiators import query
query(myObjects).select(lambda obj: obj.id)
или в сочетании с еще одной особенностью ASQ:
from asq.selectors import a_
query(myObjects).select(a_("id"))
право .. списковых. Забыл о тех :) – mpen 2010-11-23 22:13:24