2010-10-13 19 views
2

Nested J'ai une liste comme [["foo", ["a", "b", "c"]], ["bar", ["a", "b", "f"]]]dans Comprehension Listes

et je suis désireux de le diviser sur je peux obtenir un décompte du nombre total de As, Bs, etc. mais je suis nouveau Python et avoir un peu de temps.

J'utilise [lx for lx in [li[1] for li in fieldlist if li[1]]] pour essayer d'obtenir une liste avec tous les éléments dans les sous-sous-listes, mais qui retourne une liste avec les premiers sous-listes ([["a", "b", "c"], ["a", "b", "f"]] au lieu d'une liste avec le contenu de ces sous-listes. I » Je suis assez sûr que je ne fais que penser à ce problème, puisque je suis nouveau à la liste des compréhensions et Python

Quelqu'un a un bon moyen de le faire? (Et oui, je connais les noms que j'ai choisis (lx, li) sont horribles)

Merci

Répondre

5

Cela vous donnera la liste que vous voulez.

[lx for li in fieldlist for lx in li[1] if li[1]] 
+0

brillant. Je savais que je devais être proche, mais je ne savais pas que vous pouviez passer en revue plusieurs listes comme ça. Merci! – tjsimmons

0

Liste compréhension:

>>> s = [["foo", ["a", "b", "c"]], ["bar", ["a", "b", "f"]]] 
>>> [x for y, z in s for x in z] 
['a', 'b', 'c', 'a', 'b', 'f'] 
>>> 

Quel est le but de votre if li[1]? Si li[1] est une liste vide ou un autre conteneur, le test est redondant. Sinon, vous devriez éditer votre question pour expliquer ce qu'elle pourrait être autrement.

+0

C'est un vestige de quand j'imprimais les listes, je voulais sauter les vides. Je n'ai pas réalisé que c'était redondant. – tjsimmons

0

solution A Pythonic serait quelque chose comme:

>>> from collections import Counter 
>>> Counter(v for (field, values) in fieldlist 
...   for v in values) 
Counter({'a': 2, 'b': 2, 'c': 1, 'f': 1})