2017-05-19 1 views
0

Je suis en train de créer un graphique de nœuds comme un dictionnaire, mais je reçois des résultats inattendus:Pourquoi .clear() renvoie uniquement la dernière itération

Il est un nœud du graphe si ce mot dernière lettre est égale de la deuxième prénom lettre

Ma liste :

names = ["Mark", "Kelly", "Kurt", "Terk"] 

Mon Code:

n = [ x.lower() for x in names ] 
graph = {} 
temp = [] 
for x in n: 
    temp.clear() 
    for y in n: 
     if(x[-1]==y[0] and not x==y): 
      temp.append(y) 
    graph[x] = temp 

Résultat:

{'kurt': ['kelly', 'kurt'], 'terk': ['kelly', 'kurt'], 'kelly': ['kelly', 'kurt'], 'mark': ['kelly', 'kurt']} 

Comportement attendu

{'kurt': ['terk'], 'terk': ['kelly', 'kurt'], 'kelly': [], 'mark': ['kelly', 'kurt']} 

Qu'est-ce que je fais mal?

+2

'graph [x] = temp' ne copie pas la' list'. Vous puis «effacer» et repeupler. Tous 'graph [x]' utilisent la même 'list' –

+0

La duplication possible de [Changer un élément dans une liste change plusieurs listes ..?] (Http://stackoverflow.com/questions/18946728/changing-an-element -in-one-list-changes-multiple-lists) –

Répondre

2

.clear vide uniquement la liste, mais la même liste est assignée aux clés, puis effacée à nouveau; l'état final de la liste est ce que vous avez sur toutes les touches. Envisagez de créer une nouvelle liste pour chaque élément:

... 
for x in n: 
    temp = [] 
    for y in n: 
     if x[-1]==y[0] and x!=y: 
      temp.append(y) 
    graph[x] = temp 
+0

Oui merci, c'est si évident. Je m'attendais juste à ce que après une '.clear()' ma liste soit une nouvelle liste – Ludisposed