2017-10-30 23 views
5

Sử dụng mã bên dưới, tôi có thể nhận được câu trả lời đúng, tuy nhiên nó được lặp lại hai lần.In hai vòng lặp Python

Ví dụ: tôi chỉ muốn kết quả là [1.2038, 1.206], nhưng mã bên dưới in [1.2038, 1.206, 1.2038, 1.206]. Bất cứ ai biết những gì là sai với mã của tôi? Mọi sự trợ giúp sẽ rất được trân trọng. Cảm ơn!

spot = [1.2020, 1.2040] 
forwardSwap = [0.0018, 0.0020] 
forwardOutright = [] 

for i in range(len(spot)): 
    for i in range(len(forwardSwap)): 
     forwardOutright.append(spot[i] + forwardSwap[i]) 

print forwardOutright 
+1

Bản sao có thể có của [Thêm SUM giá trị của hai DANH SÁCH vào danh sách mới] (https://stackoverflow.com/questions/14050824/add-sum-of-values-of-two-lists-into-new-list) – yinnonsanders

+0

Sẽ phát hiện và chuyển tiếpSwap luôn có cùng số phần tử? –

Trả lời

1

Bạn chỉ cần để lặp qua một lần:

spot = [1.2020, 1.2040] 
forwardSwap = [0.0018, 0.0020] 
forwardOutright = [] 
for i in range(len(spot)): 
    forwardOutright.append(forwardSwap[i]+spot[i]) 

outout:

[1.2038, 1.206] 
+3

Điều này chỉ hoạt động nếu cả hai mảng có cùng độ dài mục. Nếu fowardswap chỉ có 1 yếu tố thì sao? –

21

Bạn nên zip thay vì một vòng lặp lồng nhau để lặp cả hai danh sách kiêm:

forwardOutright = [x+y for x, y in zip(spot, forwardSwap)] 
3

Theo mã đưa ra trong câu hỏi của bạn, cả hai vòng của bạn đang sử dụng một biến tên là i.

for i in range(len(spot)): 
    for i in range(len(forwardSwap)): 
4

này nên làm việc

list(map(lambda i: sum(i), zip(spot, forwardSwap))) 
1

Bởi vì bạn đã lồng for vòng, vòng ngoài được chạy nhiều lần như có những yếu tố của spot và vòng lặp bên trong được chạy bao nhiêu lần tùy sản phẩm độ dài. Thay vào đó bạn nên sử dụng zip:

for s, fs in zip(spot, forwardSwap): 
    forwardOutright.append(s + fs) 

Hoặc bạn có thể sử dụng danh sách hiểu:

forwardOutright = [s + fs for s, fs in zip(spot, forwardSwap)] 
0

Bạn có hai vòng lặp lồng nhau mà chạy hai lần mỗi.

Vì vậy, bạn thực thi mã bên trong vòng lặp thứ hai (2x2) 4 lần.

3

Vấn đề bạn có được gây ra bởi thực tế là vòng lặp bên trong được thực hiện hoàn toàn mỗi khi các vòng ngoài là Thực thi. tức là đối với mọi mặt hàng trong spot, bạn sẽ xem tất cả các mục trong forwardSwap và thêm một giá trị mới vào forwardOutright. Thay vào đó bạn muốn có một one-to-one kết hợp giữa hai danh sách này, vì vậy bạn có thể sử dụng:

for i,j in zip(spot, forwardSwap): forwardOutright.append(i+j)

Bạn cũng nên tránh shadowing biến của bạn, tức là sử dụng i trong cả hai vòng, thay vào đó bạn có thể sử dụng ij chẳng hạn. Nếu không, điều này sẽ khiến chương trình của bạn thực thi theo những cách không mong muốn.

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