2010-11-23 14 views
12

Tengo una lista de objetos en Python, y cada uno tiene una propiedad id. Quiero obtener una lista de esos ID.Python equivalente a C# .Seleccione?

En C# me gustaría escribir

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

¿Cómo voy a hacer esto en Python?

Respuesta

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

razón .. listas por comprensión. Olvidé sobre esos :) – mpen

17

Mira la sección "Lista de Comprensión" aquí: http://docs.python.org/tutorial/datastructures.html

Si su lista de partida se llama original_list y la nueva lista se llama id_list, que podría hacer algo como esto:

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

Si es una lista grande y solo necesita procesar los identificadores una vez, también hay expresiones de generador.

ids = (obj.id for obj in my_objects) 

for id in ids: 
    do_something(id) 

Una expresión generadora no admite el acceso aleatorio, pero le conseguirá cada ID de la demanda y por lo tanto evita la construcción de una lista de todos a la vez. las expresiones de generador son a xrange ya que las comprensiones de lista son range.

Una advertencia más con expresiones de generador es que solo se puede acceder mientras que cualquier recurso dentro de él esté abierto. Por ejemplo, el siguiente código fallará.

with open(filename) as f: 
    lines = (line for line in f) 

# f is now closed 
for line in lines: 
    print line 

La lista equivalente de comprensión funcionaría en este caso.

1

Nadie en su sano juicio podría hacer esto de la siguiente manera, pero aquí se en caso de que viene muy bien en un ejemplo más complejo

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

Si desea un equivalente directo de C# seleccionar en Python, a costa de utilizar una biblioteca de terceros, puede usar el paquete asq que proporciona una implementación inspirada en LINQ para objetos sobre iterables de Python. El uso de ASQ el código C# en su pregunta se convertiría en:

from asq.initiators import query 
query(myObjects).select(lambda obj: obj.id) 

o, combinado con otra característica de ASQ:

from asq.selectors import a_ 
query(myObjects).select(a_("id"))