У меня есть список объектов в Python, и каждый из них имеет свойство id
. Я хочу получить список этих идентификаторов.
В С# я пишу
myObjects.Select(obj => obj.id);
Как я могу сделать это в Python?
У меня есть список объектов в Python, и каждый из них имеет свойство id
. Я хочу получить список этих идентификаторов.
В С# я пишу
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
В этом случае работа над эквивалентным списком будет работать.
Если вам нужен прямой эквивалент выбора С# в Python, за счет использования сторонней библиотеки вы можете использовать asq, который обеспечивает реализацию, основанную на LINQ-for-objects, над итерами Python. Используя asq, код С# в вашем вопросе станет следующим:
from asq.initiators import query
query(myObjects).select(lambda obj: obj.id)
или, в сочетании с другой особенностью asq:
from asq.selectors import a_
query(myObjects).select(a_("id"))
Никто в здравом уме не сделает это следующим образом, но здесь он на тот случай, если он окажется полезным в более сложном примере
import operator
map(operator.attrgetter("id"), myObjects)