Python equivalente a C#.Select?
-
27-09-2019 - |
Pergunta
Eu tenho uma lista de objetos em python, e cada um deles tem um id
propriedade. Eu quero obter uma lista desses IDs.
Em C# eu escrevia
myObjects.Select(obj => obj.id);
Como eu faria isso em Python?
Solução
[obj.id for obj in myObjects]
Outras dicas
Confira a seção na "Compreensão da Lista" aqui: http://docs.python.org/tutorial/datastructures.html
Se sua lista de partidas for chamada original_list
e sua nova lista é chamada id_list
, você poderia fazer algo assim:
id_list = [x.id for x in original_list]
Se for uma grande lista e você só precisará processar os IDs uma vez, também existem expressões de gerador.
ids = (obj.id for obj in my_objects)
for id in ids:
do_something(id)
Uma expressão do gerador não suporta acesso aleatório, mas você obterá cada ID sob demanda e, portanto, evita a criação de uma lista de uma só vez. Expressões geradoras são para xrange
como as compreensões da lista são para range
.
Mais uma advertência com expressões de gerador é que ela só pode ser acessada enquanto qualquer recurso nela ainda estiver aberto. Por exemplo, o código a seguir falhará.
with open(filename) as f:
lines = (line for line in f)
# f is now closed
for line in lines:
print line
A compreensão da lista equivalente funcionaria neste caso.
Se você deseja um equivalente direto de C# selecionar no Python, à custa do uso de uma biblioteca de terceiros, você pode usar o ASQ Pacote que fornece um LinQ-for-Objects inspirou a implementação sobre o Python Iterables. Usando asq o código C# em sua pergunta se tornaria:
from asq.initiators import query
query(myObjects).select(lambda obj: obj.id)
Ou, combinado com outro recurso do ASQ:
from asq.selectors import a_
query(myObjects).select(a_("id"))
Ninguém em sã consciência faria isso da seguinte maneira, mas aqui está, caso seja útil em um exemplo mais complexo
import operator
map(operator.attrgetter("id"), myObjects)