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?
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?
[obj.id for obj in myObjects]
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]
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.
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)
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"))
razón .. listas por comprensión. Olvidé sobre esos :) – mpen