2012-07-09 23 views
6

że mam dwie listy:Python: Opracowanie listy, która jest sumą dwóch listach, poz mądry

a=[1,2,3,4,5] 
b=[5,4,3,2,1] 

Chcę stworzyć trzeci, który będzie liniowy suma dwóch danych:

c[i]==a[i]+b[i] 
c==[6,6,6,6,6] 

Czy można to zrobić za pomocą konstruktora? Jak:

c = [aa+bb for aa in a for bb in b] 

(co oczywiście nie wraca co chcę)

+0

Nie było mnie oczywiste, co wynika z przypisania do 'C' byłoby, więc próbowałem go w IDLE i wklejony w wartości' C' dla celów poglądowych. –

Odpowiedz

21

Zastosowanie zip():

>>> a = [1,2,3,4,5] 
>>> b = [5,4,3,2,1] 
>>> c = [x+y for x,y in zip(a, b)] 
>>> c 
[6, 6, 6, 6, 6] 

lub:

>>> c = [a[i] + b[i] for i in range(len(a))] 
>>> c 
[6, 6, 6, 6, 6] 

c = [aa+bb for aa in a for bb in b] jest coś takiego:

for aa in a: 
    for bb in b: 
      aa+bb 

Oznacza to, wybierz 1 z a i następnie pętli wszystkich elementów b dodając je do 1, a następnie wybierz 2 z a a następnie ponownie pętli wszystkich wartości b dodając je do 2, dlatego nie oczekiwano rezultatów.

+0

Pokonaj mnie 15 sekund. +1, a ja usunę mój. – mgilson

+1

Powinien zniechęcać do używania 'for i in range (len (a))', używanie iteratorów jest lepszą praktyką. – PaulMcG

+1

Zrobiłem trochę 'timeit', a po przetestowaniu wszystkich rozwiązań na tej stronie, najszybszy był' starmap (add, zip (a, b)), taktowanie w 0.65s. Powyższe rozwiązania wynosiły odpowiednio 1,18 i 0,94. –

-1

Nie wiem, co próbujesz zrobić, ale możesz łatwo zrobić to, o co prosiłeś z numpy. Po prostu nie jestem pewien, czy naprawdę chcesz dodać tę dodatkową zależność do swojego kodu.

1
sums = [a[i]+b[i] for i in range(len(a))] 
+0

dzięki za - punkty ... nie wiem dlaczego to jest dokładnie to, o co prosił ... –

+0

To jest niepoprawne. 'range()' przyjmuje liczbę całkowitą, a nie listę: http://ideone.com/bnDMC. Zamiast tego powinieneś użyć len (a). – C0deH4cker

+0

o tak, twoja prawica ... pisała zbyt szybko ... naprawiona ... (ale jest również opisana poniżej w poście Ashwiniego Chaudhary'ego) –

2
[ay + be for ay, be in zip(a, b)] 
5
a=[1,2,3,4,5] 
b=[5,4,3,2,1] 

[x+y for x,y in zip(a,b)] 
[6, 6, 6, 6, 6] 

OR 

map(lambda x,y:x+y, a, b) 
[6, 6, 6, 6, 6] 
+0

+1 dla 'map()'. –

+1

+1 dla 'map()' z wieloma sekwencjami, które niejawnie zawierają 'izip_longest'. – PaulMcG

Powiązane problemy