2016-12-02 1 views
0

Ich bin neu in Python und Programmierung im Allgemeinen. Ich arbeitete an Pyschool-Übungen Thema 8, Q 11 über das Konvertieren von Wörterbuch zu Spare Vectore.Python: Dictionary to Spare Vector

Ich wurde gebeten, eine Funktion zu schreiben, die ein Wörterbuch zurück in seine Ersatzvektordarstellung konvertiert.

Beispiele

>>> convertDictionary({0: 1, 3: 2, 7: 3, 12: 4}) 
[1, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 4] 
>>> convertDictionary({0: 1, 2: 1, 4: 2, 6: 1, 9: 1}) 
[1, 0, 1, 0, 2, 0, 1, 0, 0, 1] 
>>> convertDictionary({}) 
[] 

Ich habe viele Male versucht. die neuesten Code unten ich habe:

def convertDictionary(dictionary): 
    k=dictionary.keys() 
    v=dictionary.values() 
    result=[] 
    for i in range(0,max(k)): 
     result.append(0) 
     for j in k: 
      result[j]=v[k.index(j)] 
    return result 

Der zurück Fehler ist:

Traceback (most recent call last): 
File "Code", line 8, in convertDictionary 
IndexError: list assignment index out of range 

mir jemand helfen könnte? Ich danke dir sehr!

+0

Sie versuchen, auf Listenelemente zuzugreifen, bevor die Liste erstellt wurde. Erstellen Sie zunächst eine Liste aller Nullen 'vector = [0] * max (k)'. Verwenden Sie dann Ihre innere Schleife, um Nicht-Nullen zu aktualisieren. – DyZ

Antwort

0

So etwas sollte genügen:

M = max(dictionary, default=0) 
vector = [dictionary.get(i, 0) for i in range(M)] 

Übersetzt in eine gute alte for-Schleife

M = max(dictionary, default=0) 
vector = [] 
for i in range(M): 
    vector.append(dictionary.get(i, 0)) 

Die get Methode können Sie einen Standard als zweites Argument für den Fall zur Verfügung stellen der Schlüssel fehlt . Sobald Sie mehr Fortschritt bekommen, können Sie einen defaultdict

Edit verwenden: der Standardparameter für max erfordert Python> 3.4. Sie können entweder Ausnahmebehandlung (allgemein bevorzugt) oder explizite Prüfungen für ein leeres Wörterbuch verwenden, um mit diesem Fall umzugehen, wenn Sie frühere Versionen haben.

0

Ihr Code funktioniert logisch gut, aber Sie haben ein Problem der Einrückung. Ihre Funktion sollte sein:

def convertDictionary(dictionary): 
    k=dictionary.keys() 
    v=dictionary.values() 
    result=[] 
    for i in range(0,max(k)): 
     result.append(0) 
    for j in k: 
     result[j]=v[k.index(j)] 
    return result 

Das Problem ist, dass Ihre zweite for innerhalb der ersten war. Was Sie wollen, ist eine Liste mit max(k) Elementen zu erstellen und dann die richtigen Werte hineinzulegen. Dann sollten die zwei for Schleifen hintereinander sein, anstatt einer innerhalb der anderen.

+2

@DYZ Das ist nicht der Punkt, OP möchte wissen, was mit ihrem Code falsch ist. –

+1

Ja, wenn wir die erste Schleife ändern, würden wir damit anfangen, dass es nicht notwendig ist. In seltenen Fällen müssen Sie eine Liste in Python auffüllen. –