Hay 2 listas dadas, supongamos:

list1 = ['node1','node2','node3','node4']
list2 = ['goal1','goal2','goal3']

Requiero una lista que devuelve:

result = [['node1','node2','node3','node4','goal1'],
       ['node1','node2','node3','node4','goal2'],
       ['node1','node2','node3','node4','goal3']]

Esto es lo que tengo:

result = []
for i in range (len(list2)):
    list1.append(list2[i])
    result.append(list1)
    list1.pop()

El problema es que el resultado no se agrega con el valor deseado. Se imprime,

[['node1', 'node2', 'node3', 'node4'],
 ['node1', 'node2', 'node3', 'node4'],
 ['node1', 'node2', 'node3', 'node4']] 

Después de completar el bucle for.

¿Qué estoy haciendo mal?

2
Janmajay 10 dic. 2015 a las 22:24

3 respuestas

La mejor respuesta

Puede agregar list1 cada objetivo al final de list1 usando una compilación de lista:

list1 = ['node1', 'node2', 'node3', 'node4']
list2 = ['goal1', 'goal2', 'goal3']
print([list1 + [gl] for gl in list2])

Salida:

[['node1', 'node2', 'node3', 'node4', 'goal1'], 
['node1', 'node2', 'node3', 'node4', 'goal2'], 
['node1', 'node2', 'node3', 'node4', 'goal3']]
7
Padraic Cunningham 10 dic. 2015 a las 19:49

Lo que está haciendo su ciclo es agregar repetidamente el mismo objeto de lista (list1) a result. Puede verificar eso haciendo algo como list1.append(True) después de ejecutar el ciclo y verificar result nuevamente:

[['node1', 'node2', 'node3', 'node4', True], 
 ['node1', 'node2', 'node3', 'node4', True], 
 ['node1', 'node2', 'node3', 'node4', True]]

Lo que desea hacer es hacer una copia de list1 para agregar cada vez, como:

for i in range (len(list2)):
    list1.append(list2[i])
    result.append(list(list1))
    list1.pop()

Aunque probablemente usaría la concatenación de listas, que implícitamente crea una nueva lista:

for item in list2:
    result.append(list1 + [item])
4
Community 23 may. 2017 a las 12:03

Puedes arreglar esto usando extend:

>>> for i in range(len(list2)):
    tmp = []
    tmp.extend(list1)
    tmp.append(list2[i])
    all_paths.append(tmp)


>>> all_paths
[['node1', 'node2', 'node3', 'node4', 'goal1'], ['node1', 'node2', 'node3', 'node4', 'goal2'], ['node1', 'node2', 'node3', 'node4', 'goal3']]
0
Brien 10 dic. 2015 a las 19:31