web-dev-qa-db-fra.com

Possible d'ajouter plusieurs listes à la fois? (Python)

Je souhaite ajouter une série de listes à une liste unique qui est en quelque sorte la liste "principale" d'un programme que j'essaie d'écrire. Y at-il un moyen de faire cela dans une ligne de code plutôt que comme 10? Je suis débutant alors je n'ai aucune idée ...

Pour une meilleure image de ma question, si j'avais ces listes:

x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]

Et voulez ajouter y et z à x. Au lieu de faire:

x.append(y)
x.append(z)

Y a-t-il un moyen de faire cela dans une ligne de code? J'ai déjà essayé:

x.append(y, z)

Et ça ne marchera pas.

20
anon
x.extend(y+z)

devrait faire ce que tu veux

ou 

x += y+z

ou même

x = x+y+z
37
Joran Beasley

Prolonger mon commentaire

In [1]: x = [1, 2, 3]
In [2]: y = [4, 5, 6]
In [3]: z = [7, 8, 9]
In [4]: from itertools import chain
In [5]: print list(chain(x,y,z))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
15
night-crawler

Vous pouvez utiliser la fonction sum avec la valeur de départ (liste vide) indiquée:

a = sum([x, y, z], [])

Ceci est particulièrement approprié si vous souhaitez ajouter un nombre arbitraire de listes.

10
Minjoon Seo

équivalent à la réponse ci-dessus, mais suffisamment différent pour mériter une mention:

my_map = {
   'foo': ['a', 1, 2],
   'bar': ['b', '2', 'c'],
   'baz': ['d', 'e', 'f'],
} 
list(itertools.chain(*my_map.values()))
['d', 'e', 'f', 'a', 1, 2, 'b', '2', 'c']

dans l'expression ci-dessus, * est important pour obtenir un résultat en tant que chaîne, c'est la même chose que la chaîne précédente (x, y, z). Notez également que le résultat est commandé par hachage.

1
msudder

Si vous préférez une approche légèrement plus fonctionnelle, vous pouvez essayer:

import functools as f

x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]

x = f.reduce(lambda x, y: x+y, [y, z], x)

Cela vous permettra de concaténer un nombre illimité de listes dans la liste x.

Si vous souhaitez simplement concaténer un nombre quelconque de listes (c.-à-d. Pas sur une liste de base), vous pouvez simplifier pour:

import functools as f
from operator import add
big_list = f.reduce(add, list_of_lists)

Veuillez noter que notre BFDL a des réserves concernant lambdas, réduire et amis: https://www.artima.com/weblogs/viewpost.jsp?thread=98196

Pour compléter cette réponse, vous pouvez en savoir plus sur reduction dans la documentation: https://docs.python.org/3/library/functools.html#functools.reduce

Je cite: "Appliquer la fonction de deux arguments de manière cumulative aux éléments de la séquence, de gauche à droite, afin de réduire la séquence à une valeur unique."

P.S. Utiliser sum() comme décrit dans https://stackoverflow.com/a/41752487/532513 est très compact, il semble fonctionner avec des listes et est très rapide (voir https://stackoverflow.com/ a/33277438/532513 ) mais help(sum) dans Python 3.6 dit ce qui suit:

Cette fonction est spécialement conçue pour être utilisée avec des valeurs numériques et peut rejeter les types non numériques.

Bien que cela soit légèrement inquiétant, je le garderai probablement comme première option pour concaténer des listes.

1
Charl Botha

En une ligne, cela peut être fait de la manière suivante 

x.extend(y+z)

ou 

x=x+y+z
0
SomnAth Pal