J'essayais de concaténer deux listes, qui sont «Noms» et «Âges». Mais je voulais faire cela en ajoutant leur index de [i + 1] à chaque fois à une autre liste. Donc au lieu de ['John', '17', 'Mike', '21'], mon objectif était que chaque paire ait un index différent et soit un élément de liste. Comme ça -> [['John', ' 17 '], [' Mike ',' 21 ']]

(Remarque: je sais que je peux le faire avec la fonction zip (), c'est pour la pratique)

Alors j'ai fini avec ce code ->

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)

Sortie -> [['Ana', '17'], ['John', '22'], ['Bob', '33'], ['Mike', '8'], ['July', «76»]]

Donc, comme vous pouvez le voir, j'ai réussi à le faire, mais la chose étrange est cette ligne b.append ([] + a). J'ai eu ce que je veux accidentellement, quand je tape b.append (a), cela renvoie une liste b vide. Mais en suivant le chemin dans le code ci-joint, j'accomplis ce que j'essaye de faire. Quelqu'un peut-il expliquer pourquoi cela fonctionne? Je n'ai pas pu l'attraper.

Merci d'avance.

0
Burak Baris 9 déc. 2020 à 16:13

3 réponses

Meilleure réponse

L'ajout d'impressions dans le code montre que b est «effacé» après la boucle et qu'il ne stockait pas les informations correctes à l'intérieur de la boucle. Ce sont essentiellement des copies du même 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']]
[[], [], [], [], []]

C'est parce que les listes sont mutables en python. Lorsque vous l'effacez, les données vers lesquelles b pointe sont également supprimées. Lorsque vous faites []+a, vous créez une nouvelle liste qui n'est plus une référence à a. En changeant le code de cette façon, vous pouvez obtenir ce que vous voulez:

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)

Pour vous aider à comprendre ce que j'entends par mutable, consultez l'exemple suivant:

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

Et c'est pourquoi a+[] fonctionne:

a = ['some data']
b = [a+[]]
print(b)
a.clear()
print(b)
[['some data']]
[['some data']]
2
Z Li 9 déc. 2020 à 13:18

Si les deux listes ont le même nombre d'éléments, vous pouvez utiliser la fonction zip ().

Remarque: La fonction zip () n'itérera que jusqu'à ce que la plus petite liste soit passée.

list1=[]
for x,y in zip(names,ages):
    list1.append([x,y])
print(list1)
0
Amit Kumar 9 déc. 2020 à 13:16

Voici ma solution en utilisant une compréhension de liste.

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 déc. 2020 à 13:19
65217516