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?

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top