2017-05-05 3 views
1

Die Funktion unten folgende Listen erhält:Hinzufügen von Elementen zu Python Wörterbuch durch Schlüssel

L1= [[12345,75,'English'], 
     [23452,83,'Physics'], 
     [23560,81,'Statistics'], 
     [23415,61,'Computer'], 
     [23459,90,'Physics'],  
     [12345,75,'Computer'], 
     [23452,100,'Statistics']] 

L2= [['a','English'], 
      ['b','Physics'], 
      ['c','Computer'], 
      ['d','Statistics'], 
      ['e','Philosophy']] 

Die Funktion:

def TeachMarks (L1, L2): 
     teacherd=dict(L2) #key- teacher name, value- subject 
     Dc=dict.fromkeys(teacherd.values(),[]) #key-subj, value- empty list 

     for i in L1: 
      subj=i[2] 
      Dc[subj].append(i[0]) 

     print '\n' 
     print Dc 

Jede interne Liste in L1 ist Gegenstand in der [2] Position. Jeder Schlüssel des Wörterbuchs (Dc) ist ein Thema und sein Wert ist eine leere Liste. Die Funktion soll das erste Element in der internen Liste übernehmen und es der Liste hinzufügen, das ist der Wert des relevanten Subjekts im Wörterbuch.

Aber wenn ich es ausführe, fügt es tatsächlich das erste Element jeder internen Liste (von L1) zu jedem der Werte hinzu. Dies ist die Ausgabe:

{'Statistics': [12345, 23452, 23560, 23415, 23459, 12345, 23452], 'Philosophy': [12345, 23452, 23560, 23415, 23459, 12345, 23452], 'Computer': [12345, 23452, 23560, 23415, 23459, 12345, 23452], 'Physics': [12345, 23452, 23560, 23415, 23459, 12345, 23452], 'English': [12345, 23452, 23560, 23415, 23459, 12345, 23452]} 

Was mache ich falsch?

Dank

+0

was halten Sie die Ausgabe wie> –

+0

Der Standard leere Liste sein wollen das gleiche für jede Taste ist?. –

+0

Versuchen Sie zu überprüfen, ob 'subj == i [2]'? Dann machen Sie es zu einem 'if' und setzen Sie' append() 'darin – kuro

Antwort

1

dict.fromkeys verwendet die gleichen Liste für jede Taste. Sie benötigen separate Listen. Sie sollten ein Diktatverständnis verwenden.

Dc={subject: [] for subject in teacherd.values()} 
+0

Können Sie erklären, was es bedeutet, erstellt die gleiche Liste (oder verweisen mich auf eine relevante Erklärung von fromkeys)? das erste Argument ist eine Folge von Werten (das sind in meinem Fall die Werte aus einem anderen Wörterbuch) und die zweite ist, was ich für Werte des Wörterbuchs haben möchte, das für jeden Schlüssel eine leere Liste ist. – Hana

+0

A [** 'defaultdict' **] (https://docs.python.org/2/library/collections.html#collections.defaultdict) ist möglicherweise eine bequemere Lösung. –

+0

Aber es ist nicht "eine leere Liste für jeden Schlüssel". Es ist * eine * leere Liste, die zwischen allen Schlüsseln geteilt wird - daher das Ergebnis, das Sie sehen. –

0

Sie verwenden dieselbe leere Liste für jeden Schlüssel erneut.

Sie könnten eine defaultdict verwenden. Dies übernimmt eine Factory-Funktion, die für jeden neuen Schlüssel aufgerufen wird. Direkt list und es wird list() nennen fehlende Schlüssel zu erstellen:

from collections import defaultdict 

def TeachMarks(L1): 
    Dc = defaultdict(list) 

    for value, _, subject in L1: 
     Dc[subject].append(value) 
Verwandte Themen