J'ai essayé de trouver un moyen de parcourir une structure hiérarchique, comme une liste chaînée, en utilisant une expression de liste, mais je n'ai rien trouvé qui semble fonctionner.Comment parcourir une liste liée en utilisant une compréhension de liste?
Fondamentalement, je veux convertir ce code:
p = self.parent
names = []
while p:
names.append(p.name)
p = p.parent
print ".".join(names)
dans un one-liner comme:
print ".".join([o.name for o in <???>])
Je ne sais pas comment faire le traversal dans la partie ???
, bien que , d'une manière générique (si c'est encore possible). J'ai plusieurs structures avec des attributs de type .parent
similaires, et je ne veux pas écrire une fonction de rendement pour chacun.
Edit:
Je ne peux pas utiliser les méthodes de l'objet lui-même __iter__
parce que son déjà utilisé pour itérer sur les valeurs contenues dans l'objet lui-même. La plupart des autres réponses, sauf pour liori, hardcode le nom de l'attribut, ce que je veux éviter.
Voici mon adaptation basée sur la réponse de Liori:
import operator
def walk(attr, start):
if callable(attr):
getter = attr
else:
getter = operator.attrgetter(attr)
o = getter(start)
while o:
yield o
o = getter(o)
oui! C'est le genre de chose que je cherchais. J'ai mis à jour ma réponse avec mon adaptation. –
'fixedpoint' peut être écrit comme en termes de [cfor'] de David X (http://stackoverflow.com/questions/2740901/simulating-c-style-for-loops-in-python/2741943#2741943) un peu Fonction plus générale: 'def point fixe (f, start, stop): retourne cfor (début, lambda courant: courant! = stop, f)' –