2010-11-23 4 views
12

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?

Répondre

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

droite .. liste compréhensions. J'ai oublié ceux-ci :) – mpen

17

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] 
6

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.

1

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) 
2

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"))