2012-07-09 52 views
6

Nói rằng tôi có hai danh sách:Python: Sản xuất danh sách mà là một tổng của hai danh sách, mục khôn ngoan

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

Tôi muốn tạo ra một thứ ba sẽ là tổng tuyến tính của hai đưa ra:

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

Có thể thực hiện với hàm tạo 'for' không? Giống như:

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

(mà rõ ràng là trả về không phải những gì tôi muốn)

+0

Đó là không rõ ràng cho tôi biết kết quả của giao cho 'c' sẽ, vì vậy tôi đã thử nó trong IDLE và dán vào giá trị của' c' cho mục đích minh họa. –

Trả lời

21

Sử dụng 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] 

hay:

>>> 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] là một cái gì đó như:

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

điều này có nghĩa, chọn 1 từ a và sau đó lặp qua tất cả các yếu tố của b khi thêm chúng vào 1, và sau đó chọn 2 từ a và sau đó một lần nữa lặp qua tất cả các giá trị của b khi thêm chúng vào 2, đó là lý do tại sao bạn đã không nhận được kết quả mong đợi.

+0

Đánh bại tôi sau 15 giây. 1 và tôi sẽ xóa của tôi. – mgilson

+1

Nên ngăn cản sử dụng 'cho i trong phạm vi (len (a))', sử dụng trình vòng lặp là thực hành tốt hơn. – PaulMcG

+1

Đã thực hiện một số 'timeit' và sau khi kiểm tra tất cả các giải pháp trên trang này, nhanh nhất là' starmap (thêm, zip (a, b)) ', tốc độ là 0,65 giây. Các giải pháp trên tương ứng là 1,18 và 0,94. –

-1

Tôi không biết những gì bạn đang cố gắng làm, nhưng bạn có thể dễ dàng làm những gì bạn đã yêu cầu với gumpy. Tôi chỉ không chắc chắn bạn thực sự muốn thêm phụ thuộc vào mã của bạn.

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

cảm ơn vì các điểm ... dunno lý do tại sao đây chính xác là những gì anh ta yêu cầu ... –

+0

Nó không chính xác. 'range()' lấy một số nguyên, không phải là một danh sách: http://ideone.com/bnDMC. Bạn nên sử dụng len (a) để thay thế. – C0deH4cker

+0

oh vâng quyền của bạn ... đã gõ quá nhanh ... cố định ... (nhưng nó cũng được bao gồm dưới đây trong bài viết của Ashwini Chaudhary) –

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 cho 'map()'. –

+1

+1 cho 'map()' với nhiều chuỗi, mà ngầm thực hiện một 'izip_longest'. – PaulMcG

Các vấn đề liên quan