J'ai une liste d'objets en Python, et ils ont chacun une propriété id
. Je veux obtenir une liste de ces ID.Équivalent en Python de C# .Select?
En C# j'écrire
myObjects.Select(obj => obj.id);
Comment pourrais-je faire cela en Python?
J'ai une liste d'objets en Python, et ils ont chacun une propriété id
. Je veux obtenir une liste de ces ID.Équivalent en Python de C# .Select?
En C# j'écrire
myObjects.Select(obj => obj.id);
Comment pourrais-je faire cela en Python?
[obj.id for obj in myObjects]
Vérifiez la section sur « Liste Comprehension » ici: http://docs.python.org/tutorial/datastructures.html
Si votre liste de départ est appelée original_list
et votre nouvelle liste est appelée id_list
, vous pouvez faire quelque chose comme ceci:
id_list = [x.id for x in original_list]
Si c'est une grande liste et que vous n'avez besoin de traiter les identifiants qu'une seule fois, il y a aussi des expressions de générateur.
ids = (obj.id for obj in my_objects)
for id in ids:
do_something(id)
Une expression de générateur ne prend pas en charge l'accès aléatoire, mais vous obtiendrez chaque identifiant de la demande et évite ainsi la construction d'une liste à la fois. les expressions de générateur sont à xrange
comme les compréhensions de liste sont à range
. Un autre avertissement avec des expressions de générateur est qu'il ne peut être consulté que tant que toute ressource à l'intérieur est toujours ouverte. Par exemple, le code suivant échouera.
with open(filename) as f:
lines = (line for line in f)
# f is now closed
for line in lines:
print line
La compréhension de liste équivalente fonctionnerait dans ce cas.
Personne dans leur esprit serait faire de la façon suivante, mais ici, il est dans le cas où il est très pratique dans un exemple plus complexe
import operator
map(operator.attrgetter("id"), myObjects)
Si vous voulez un équivalent direct de C# sélectionner en Python, Au prix de l'utilisation d'une bibliothèque tierce, vous pouvez utiliser le package asq qui fournit une implémentation inspirée de LINQ-for-objects sur les iterables Python. En utilisant asq le code C# dans votre question deviendrait:
from asq.initiators import query
query(myObjects).select(lambda obj: obj.id)
ou, combinée à une autre caractéristique de l'ASQ:
from asq.selectors import a_
query(myObjects).select(a_("id"))
droite .. liste compréhensions. J'ai oublié ceux-ci :) – mpen