2010-11-23 2 views
12

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

В C# я бы написать

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

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

ответ

10
[obj.id for obj in myObjects] 
+0

право .. списковых. Забыл о тех :) – mpen 2010-11-23 22:13:24

17

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

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

id_list = [x.id for x in original_list] 
6

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

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 

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

1

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

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

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