Вопрос

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

В 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

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

Если вы хотите прямой эквивалент C # выбирать в Python, по стоимости использования сторонней библиотеки вы можете использовать асуф Пакет, который обеспечивает вдохновленную реализацию Linq-для объектов на Python Iterables. Использование 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"))

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

import operator
map(operator.attrgetter("id"), myObjects)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top