Python эквивалент C # .Select? - PullRequest
       27

Python эквивалент C # .Select?

13 голосов
/ 24 ноября 2010

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

В C # я бы написал

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

Как бы я это сделал в Python?

Ответы [ 5 ]

19 голосов
/ 24 ноября 2010

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

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

id_list = [x.id for x in original_list]
11 голосов
/ 24 ноября 2010
[obj.id for obj in myObjects]
7 голосов
/ 24 ноября 2010

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

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

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

3 голосов
/ 07 июня 2011

Если вы хотите получить прямой эквивалент C # select в 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"))
1 голос
/ 24 ноября 2010

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

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