2010-04-29 13 views
35

J'ai un uniforme liste des objets en python:liste Extrait des attributs de la liste des objets en python

class myClass(object): 
    def __init__(self, attr): 
     self.attr = attr 
     self.other = None 

objs = [myClass (i) for i in range(10)] 

Maintenant, je veux extraire une liste avec un attribut de cette classe (disons attr) , afin de passer si une fonction (pour tracer les données par exemple)

Quelle est la façon pythonique de le faire,

attr=[o.attr for o in objsm] 

?

liste et obtenir peut-être ajouter une méthode à lui, donc je peux utiliser un idiome comme

objs.getattribute("attr") 

?

+0

Voir en double http://stackoverflow.com/q/677656/127465, esp. la réponse avec operator.attrgetter – ThomasH

Répondre

25

Vous pouvez également écrire:

attr=(o.attr for o in objsm) 

De cette façon, vous obtenez un générateur qui conserve la mémoire. Pour plus d'avantages, regardez Generator Expressions.

47

attrs = [o.attr for o in objs] était le bon code pour faire une liste comme celle que vous décrivez. N'essayez pas de sous-classer list pour cela. Y a-t-il quelque chose que vous n'avez pas aimé dans cet extrait?

+1

Seulement que c'est trop verbeux et je vais l'utiliser souvent, donc un raccourci serait pratique. Les tableaux structurés de numpy arr ['colname'] ou recarrays arr.colname, fournissent déjà quelque chose de similaire, mais dans ce cas j'utilise des objets qui contiennent des données nommées (et quelques fonctions). – franjesus