Utilizando el siguiente código, puedo obtener la respuesta correcta, sin embargo, se repite dos veces .

Por ejemplo, solo desearía un resultado de [1.2038, 1.206], pero el siguiente código imprime [1.2038, 1.206, 1.2038, 1.206]. Alguien sabe lo que está mal con mi código? Cualquier ayuda sería muy apreciada. ¡Gracias!

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
6
Jing Yi 30 oct. 2017 a las 16:29

7 respuestas

La mejor respuesta

Solo necesita hacer un bucle una vez:

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

Fuera fuera:

[1.2038, 1.206]
1
Ajax1234 30 oct. 2017 a las 13:35

El problema que tiene es causado por el hecho de que el bucle interno se ejecuta completamente cada vez que se ejecuta el bucle externo. es decir, para cada elemento en spot está revisando cada elemento en forwardSwap y agregando un nuevo valor a forwardOutright. En su lugar, desea una coincidencia uno a uno entre estas dos listas, por lo que podría usar:

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

También debe evitar sombrear sus variables, es decir, usar i en ambos bucles, en su lugar podría usar i y j por ejemplo. De lo contrario, esto hará que su programa se ejecute de manera inesperada.

3
Charlie Allatson 30 oct. 2017 a las 13:37

Debido a que ha anidado for bucles, el bucle externo se ejecuta tantas veces como haya elementos de spot y el bucle interno se ejecuta tantas veces como el producto de las longitudes. En su lugar, debe usar zip:

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

O puede usar una lista de comprensión:

forwardOutright = [s + fs for s, fs in zip(spot, forwardSwap)]
1
yinnonsanders 30 oct. 2017 a las 13:34

Según el código dado en su pregunta, ambos bucles están utilizando una variable denominada i.

for i in range(len(spot)):
    for i in range(len(forwardSwap)):
3
Nandeep Mali 30 oct. 2017 a las 13:33

Debería zip en lugar de un bucle anidado para iterar ambas listas al mismo tiempo:

forwardOutright = [x+y for x, y in zip(spot, forwardSwap)]
21
akash karothiya 30 oct. 2017 a las 13:34

Tienes dos bucles anidados que se ejecutan dos veces cada uno.

Por lo tanto, ejecuta el código dentro del segundo ciclo (2x2) 4 veces.

0
rwms 30 oct. 2017 a las 13:35

Esto debería funcionar

list(map(lambda i: sum(i), zip(spot, forwardSwap)))
3
daemon24 30 oct. 2017 a las 13:34