2017-04-17 55 views
6

Jak dodać wszystkie wartości z kolumny w tablicy Pythona? Idealnie chcę to zrobić bez importowania żadnych dodatkowych bibliotek.Jak podsumować kolumny tablicy w Pythonie

input_val = [[1, 2, 3, 4, 5], 
      [1, 2, 3, 4, 5], 
      [1, 2, 3, 4, 5]] 

output_val = [3, 6, 9, 12, 15] 

wiem, że można to zrobić w zagnieżdżonej pętli for, zastanawiając się, czy istnieje lepszy sposób (jak listowego)?

Odpowiedz

11

zip i sum można tego zrobić:

Kod:

[sum(x) for x in zip(*input_val)] 

zip bierze zawartość listy wejściowej i transponuje je tak, że każdy element zawartych listach jest produkowany u w tym samym czasie. Pozwala to sum zobaczyć pierwsze elementy każdego zawartego listy, potem następna iteracja dostanie drugi element każdej listy, itp ...

Code Test:

input_val = [[1, 2, 3, 4, 5], 
      [1, 2, 3, 4, 5], 
      [1, 2, 3, 4, 5]] 

print([sum(x) for x in zip(*input_val)]) 

Wyniki:

[3, 6, 9, 12, 15] 
2

To powinno działać:

[sum(i) for i in zip(*input_val)] 
1

W przypadku, gdy zdecydują się skorzystać z dowolnej biblioteki, NumPy łatwo robi to:

np.sum(input_val,axis=0)

3

Możesz także użyć sum z zip w map funkcję:

# In Python 3.x 
>>> list(map(sum, zip(*input_val))) 
[3, 6, 9, 12, 15] 
# explicitly type-cast it to list as map returns generator expression 

# In Python 2.x, explicit type-casting to list is not needed as `map` returns list 
>>> map(sum, zip(*input_val)) 
[3, 6, 9, 12, 15] 
1

One-liner używając wyrażeń listowych: dla każdej kolumny (długość jednego wiersza) utwórz listę wszystkich pozycji w tej kolumnie i zsumuj tę listę.

output_val = [sum([input_val[i][j] for i in range(len(input_val))]) \ 
       for j in range(len(input_val[0]))] 
0

Spróbuj tego kodu. To sprawi output_val skończyć jako [3, 6, 9, 12, 15] wyraziłeś input_val:

input_val = [[1, 2, 3, 4, 5], 
      [1, 2, 3, 4, 5], 
      [1, 2, 3, 4, 5]] 

vals_length = len(input_val[0]) 
output_val = [0] * vals_length # init empty output array with 0's 
for i in range(vals_length): # iterate for each index in the inputs 
    for vals in input_val: 
     output_val[i] += vals[i] # add to the same index 

print(output_val) # [3, 6, 9, 12, 15] 
1

Chyba można użyć:

import numpy as np 
new_list = sum(map(np.array, input_val)) 
2

Spróbuj tego:

input_val = [[1, 2, 3, 4, 5], 
     [1, 2, 3, 4, 5], 
     [1, 2, 3, 4, 5]] 

output_val = [sum([i[b] for i in input_val]) for b in range(len(input_val[0]))] 

print output_val 
2

myślę, że to jest najbardziej pythonic sposobem wykonania tej czynności:

map(sum, [x for x in zip(*input_val)]) 
0
output_val=input_val.sum(axis=0) 

to uczyniłoby kod jeszcze prostsze Chyba

+0

Running to z powyższych wejść rzuca 'AttributeError:„list”obiekt ma atrybut„sum'' – Alexander