2017-01-31 3 views
0

Ich habe ein Wörterbuch in Python, die diese aussehen mögen:Scoring-Motive in Python Wörterbuch

raw = {'id1': ['KKKK', 'MMMMMMMMMMMMMMM'], 'id2': ['KKKKM', 'KKKKKK']} 

, wie Sie die Werte siehe Liste enthalten sind. Ich möchte die Liste durch eine Zahl ersetzen, die eine Punktzahl ist. Ich punkte jedes Zeichen in der Liste basierend auf ihrer Länge. Wenn die Länge 4 bis 9 ist, erhalten sie 1, von 10 bis 15 wäre 2 und 16 und länger würde 3 erhalten. Dann addiere ich alle Werte pro ID und hätte einen Wert pro ID. hier ist kleines Beispiel:

score = {'id1': 3, 'id2': 2} 

ich diesen Code versucht:

score = {} 
for val in raw.values(): 
    for i in val: 
     if len(i) >=4 and len(i) <9: 
      sc = 1 
     elif len(i) >=10 and len(i) <15: 
      sc = 2 
     else: 
      sc = 3 
     score[raw.keys()] = sc 

es nicht geben, was ich will.

Antwort

0

Ich sehe zwei Probleme in Ihrem Beispiel.

Die erste ist, dass es keine Erhöhung der Punktzahl gibt. Sie sollten einen Zähler in der äußeren Schleife initialisieren und ihn erhöhen, wenn Sie über die Elemente im Schlüssel iterieren.

for val in raw.values(): 
    score = 0 
    for i in val: 
     ... 
     score += 1 # or 2 or 4 

Das zweite Problem ist, dass Sie die spezifischen Schlüssel zugreifen müssen Sie punkten, wenn die Partitur zu speichern. Da "raw.keys()" eine Liste aller Schlüssel zurückgibt, ist es nicht sinnvoll, sie beim Speichern von Werten zu verwenden. Stattdessen sollte Ihre äußere Schleife sowohl über Schlüssel als auch über Wert iterieren, damit Sie wissen, welchen Schlüssel Sie gerade verwenden.

for key, val in raw.items(): 
    .... 

Um es zusammenzufassen, hier ist ein funktionierendes Beispiel:

score = {} 
for key, val in raw.items(): # iterating over both key and value (.items instead of .values) 
    cur_score = 0 # initializing the current score counter 
    for item in val: # use readable names! 
     item_len = len(item) # calculated once for efficiency 
     if 4 <= item_len < 9: # the python way to check value in range 
      cur_score += 1 
     elif 10 <= item_len < 15: 
      cur_score += 2 
     else: 
      cur_score += 3 
     score[key] = cur_score 

Viel Spaß!

0

Sie haben versucht, die gesamte Liste der Schlüssel als Index in das Wörterbuch zu verwenden. Außerdem fügen Sie diese Zuweisung in beide Schleifen ein. Was hast du erwartet dies bei jeder Iteration zu tun?

Zuerst muss Ihre äußere Schleife durch die Liste der Wörterbuchelemente, nicht nur die Werte durchlaufen. Sie müssten so etwas wie:

for key, val in raw.iteritems(): 

Als nächstes müssen Sie eine laufende Summe der Punkte für die einzelnen Strings halten. Sie sollten so aussehen ... aber die Grundidee ist

total = 0 
    for item in my_list: # you have to determine what my_list should be 
     sc = # score for that item 
     total += sc 

... und schließlich, nach dieser Schleife ...

score[key] = total 

, dass Sie sollten sich vorwärts bekommen.

0

Sie müssen alle Schlüssel-, Wertepaare des Wörterbuchs durchlaufen und eine laufende Summe der Bewertungen für jedes Element der Wörterbuchwerte verwalten (was in Ihrem Fall eine Liste ist).

Sie können Ihren Code wie folgt reformieren, um die gewünschte Ausgabe zu erhalten.

raw = {'id1': ['KKKK', 'MMMMMMMMMMMMMMM'], 'id2': ['KKKKM', 'KKKKKK']} 

score = {} 
# iterating through all the key, value pairs of the dictionary 
for key, value in raw.items(): 
    sc = 0 
    # iterating through all the elements of the current value 
    for item in value: 
     if len(item) >=4 and len(item) <=9: 
      sc += 1 
     elif len(item) >=10 and len(item) <=15: 
      sc += 2 
     else: 
      sc += 3 
    score[key] = sc 

print(score) 

Es Ausgänge:

{'id1': 3, 'id2': 2} 

also die Schleife, for key, value in raw.items(): Läufe für jeden Schlüssel, Wert-Paar des Wörterbuchs, die 'id1': ['KKKK', 'MMMMMMMMMMMMMMM'] und 'id2': ['KKKKM', 'KKKKKK'] sind.

Anschließend wird die verschachtelte Schleife for item in value: zweimal für zwei Werte des Wörterbuchschlüssels ausgeführt, die ['KKKK', 'MMMMMMMMMMMMMMM'] und ['KKKKM', 'KKKKKK'] sind.