34 votes

Fusion / ajout de listes en Python

Je suis assez sûr il devrait y avoir une plus Pythonic façon de le faire - mais je ne peux pas penser une seule: Comment puis-je les fusionner en deux dimensions, la liste dans un one-dimensional liste? Une sorte de zip/map mais avec plus de deux itérateurs.

Par exemple, j'ai la liste suivante:

array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Je veux avoir

result = [12, 15, 18] # [1+4+7, 2+5+8, 3+6+9]

Pour l'instant ce que j'ai trouvé est:

def add_list(array):
    number_items = len(array[0])
    result = [0] * number_items
    for index in range(number_items):
        for line in array:
            result[index] += line[index]
    return result

Mais qui n'a pas l'air très élégant/Pythonic pour moi. Côté de ne pas avoir vérifié si toutes les "lignes" dans le tableau 2D sont de la même longueur, peuvent être ajoutés les uns aux autres, etc. Quelle serait une meilleure façon de le faire?

70voto

Ned Batchelder Points 128913
[sum(a) for a in zip(*array)]

63voto

Charles Merriam Points 4498

[somme (valeur) pour la valeur dans zip (* tableau)] est assez standard.

Cela pourrait vous aider à comprendre:

 In [1]: array=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [2]: array
Out[2]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [3]: *array
------------------------------------------------------------
   File "<ipython console>", line 1
     *array
     ^
<type 'exceptions.SyntaxError'>: invalid syntax
 

L'étoile unaire n'est pas un opérateur en soi. Il décompresse les éléments du tableau en arguments en appels de fonction.

 In [4]: zip(*array)
Out[4]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
 

zip () est une fonction intégrée

 In [5]: zip(*array)[0]
Out[5]: (1, 4, 7)
 

chaque élément de la liste renvoyée par zip est un ensemble de nombres que vous voulez.

 In [6]: sum(zip(*array)[0])
Out[6]: 12

In [7]: [sum(values) for values in zip(*array)]
Out[7]: [12, 15, 18]
 

14voto

ngn Points 2820

Une autre manière:

 map(sum, zip(*array))
 

3voto

heltonbiker Points 4725

Si vous êtes d’accord avec fivebells, vous pouvez aussi utiliser Numpy, qui est une implémentation plus petite (importation plus rapide) et plus générique des éléments de type tableau. (en fait, c'est une dépendance de Scipy). Ce sont d’excellents outils qui, comme on l’a dit, sont un «incontournable» si vous manipulez ce type de manipulations.

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