443 votes

joindre la liste des listes en python

La syntaxe est-elle courte pour joindre une liste de listes dans une seule liste (ou itérateur) en python?

Par exemple j'ai une liste comme suit et je veux itérer sur a, b et c.

 x = [["a","b"], ["c"]]
 

Le meilleur que je peux trouver est le suivant.

 result = []
[ result.extend(el) for el in x] 

for el in result:
  print el
 

648voto

CTT Points 7235
import itertools
a = [["a","b"], ["c"]]
print list(itertools.chain(*a))

310voto

CMS Points 315406
x = [["a","b"], ["c"]]

result = sum(x, [])

249voto

George V. Reilly Points 5471

Si vous n'allez que d'un niveau, une compréhension imbriquée fonctionnera également:

 >>> x = [["a","b"], ["c"]]
>>> [inner
...     for outer in x
...         for inner in outer]
['a', 'b', 'c']
 

Sur une ligne, cela devient:

 >>> [j for i in x for j in i]
['a', 'b', 'c']
 

42voto

nate c Points 3909
 l = []
map(l.extend, list_of_lists)
 

le plus court!

33voto

Paolo Bergantino Points 199336

Ceci est connu comme l'aplatissement, et il y a BEAUCOUP de mises en œuvre:

Comment à ce sujet, bien qu'il ne fonctionne que pour 1 niveau de profondeur d'imbrication:

>>> x = [["a","b"], ["c"]]
>>> for el in sum(x, []):
...     print el
...
a
b
c

À partir de ces liens, apparemment le plus complet-rapide-élégant-etc la mise en œuvre est la suivante:

def flatten(l, ltypes=(list, tuple)):
    ltype = type(l)
    l = list(l)
    i = 0
    while i < len(l):
        while isinstance(l[i], ltypes):
            if not l[i]:
                l.pop(i)
                i -= 1
                break
            else:
                l[i:i + 1] = l[i]
        i += 1
    return ltype(l)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X