Подтвердить что ты не робот

Python эквивалент С#.Выбрать?

У меня есть список объектов в Python, и каждый из них имеет свойство id. Я хочу получить список этих идентификаторов.

В С# я пишу

myObjects.Select(obj => obj.id);

Как я могу сделать это в Python?

4b9b3361

Ответ 1

[obj.id for obj in myObjects]

Ответ 2

Ознакомьтесь с разделом "Понимание списка" здесь: http://docs.python.org/tutorial/datastructures.html

Если ваш стартовый список называется original_list, а ваш новый список называется id_list, вы можете сделать что-то вроде этого:

id_list = [x.id for x in original_list]

Ответ 3

Если это большой список, и вам нужно только обработать идентификаторы один раз, тогда есть также выражения генератора.

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

В этом случае работа над эквивалентным списком будет работать.

Ответ 4

Если вам нужен прямой эквивалент выбора С# в 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"))

Ответ 5

Никто в здравом уме не сделает это следующим образом, но здесь он на тот случай, если он окажется полезным в более сложном примере

import operator
map(operator.attrgetter("id"), myObjects)