Python эквивалент C #sselect?
-
27-09-2019 - |
Вопрос
У меня есть список объектов в 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)