Estaba intentando concatenar dos listas, que son 'Nombres' y 'Edades'. Pero quería hacer eso agregando su índice de [i + 1] cada vez a otra lista. Entonces, en lugar de ['John', '17', 'Mike', '21'], Mi objetivo era que cada par tuviera un índice diferente y fuera un elemento de lista. Así -> [['John', ' 17 '], [' Mike ',' 21 ']]

(Nota: sé que puedo hacer eso con la función zip (), esto es para practicar)

Así que terminé con ese código ->

names = ['Ana', 'John', 'Bob', 'Mike', 'July']
ages = ['17', '22', '33', '8', '76']
a = []
b = []
for i in range(len(names)):
    a.append(names[i])
    a.append(ages[i])
    b.append([] + a)
    a.clear()
print(b)

Salida -> [['Ana', '17'], ['John', '22'], ['Bob', '33'], ['Mike', '8'], ['julio', '76']]

Como puede ver, logré hacer eso, pero lo extraño es que la línea b.append ([] + a). Obtuve lo que quiero accidentalmente, cuando escribo b.append (a) devuelve una lista b vacía. Pero al seguir la ruta en el código adjunto, estoy logrando lo que estoy tratando de hacer. ¿Alguien puede explicar por qué esto está funcionando? No pude cogerlo.

Gracias de antemano.

0
Burak Baris 9 dic. 2020 a las 16:13

3 respuestas

La mejor respuesta

Agregar impresiones en el código muestra que b se 'borra' después del ciclo, y no estaba almacenando la información correcta dentro del ciclo. Esencialmente son copias del mismo a:

names = ['Ana', 'John', 'Bob', 'Mike', 'July']
ages = ['17', '22', '33', '8', '76']
a = []
b = []
for i in range(len(names)):
    a.append(names[i])
    a.append(ages[i])
    print(a)
    b.append(a)
    print(b)
    a.clear()
print(b)
['Ana', '17']
[['Ana', '17']]
['John', '22']
[['John', '22'], ['John', '22']]
['Bob', '33']
[['Bob', '33'], ['Bob', '33'], ['Bob', '33']]
['Mike', '8']
[['Mike', '8'], ['Mike', '8'], ['Mike', '8'], ['Mike', '8']]
['July', '76']
[['July', '76'], ['July', '76'], ['July', '76'], ['July', '76'], ['July', '76']]
[[], [], [], [], []]

Esto se debe a que las listas son mutables en Python. Cuando lo borra, los datos a los que apunta b también se eliminan. Cuando lo hace []+a, está creando una nueva lista que ya no es una referencia a a. Al cambiar el código de esta manera, puede obtener lo que desea:

names = ['Ana', 'John', 'Bob', 'Mike', 'July']
ages = ['17', '22', '33', '8', '76']
b = []
for i in range(len(names)):
    a = []
    a.append(names[i])
    a.append(ages[i])
    b.append(a)
print(b)

Para ayudarlo a comprender lo que quiero decir con mutable, vea el siguiente ejemplo:

a = ['some data']
b = [a]
print(b)
a.clear()
print(b)
[['some data']]
[[]]

Y esta es la razón por la que a+[] funciona:

a = ['some data']
b = [a+[]]
print(b)
a.clear()
print(b)
[['some data']]
[['some data']]
2
Z Li 9 dic. 2020 a las 13:18

Si ambas listas tienen el mismo número de elementos, entonces puede usar la función zip ().

Nota: La función zip () solo iterará hasta que pase la lista más pequeña.

list1=[]
for x,y in zip(names,ages):
    list1.append([x,y])
print(list1)
0
Amit Kumar 9 dic. 2020 a las 13:16

La siguiente es mi solución utilizando una lista de comprensión.

names = ['Ana', 'John', 'Bob', 'Mike', 'July']
ages = ['17', '22', '33', '8', '76']

new_list = [ [names[i], ages[i]] for i in range(len(names))]
    
print(new_list)
1
udimax 9 dic. 2020 a las 13:19
65217516