2016-03-18 10 views
0

fand ich eine Art und Weise, die möglicherweise erlauben kann mir dabei die Schlüssel meines Wörterbuch mit Wert zu erhalten:Attribute im Wörterbuch

mydic.keys()[mydic.values().index(value)] 

Mein Code unten:

def déchiffrement(code, dico): 
    taille3 = len(code) 
    décodé = [] 
    for i in range(taille3): 
     décodé.insert(i, dico.keys()[dico.values().index(code[i])]) 
    return décodé 

dico ist ein Wörterbuch Suche wie folgt aus:

dico = { 
    "A": [1, 9], 
    "B": [12, 19], 
    ... 
    "Z": [78, 108], 
} 

und code eine Liste von Zahlen, die korresp zu einem Brief. Die Nummern in dico sind nie gleich.

Allerdings bekomme ich ein

AttributeError: 'dict_values' object has no attribute 'index'

, die ich nicht verstehe, weil dieser Code auf anderen Leuten Codes zu funktionieren scheint.

+0

Da Python3 ausgibt, 'dict.values ​​()' gibt einen Iterator statt einer Liste für die Effizienz, ähnlich zu 'dict.itervalues ​​()' von Python2. – JulienD

+2

@muraveill: Um genau zu sein, 'dict.values ​​()' in Python 3 ist das Äquivalent von 'dict.viewvalues ​​()' in 2. –

+0

Okay, also ist es nur eine Frage der Version? Wie kann ich das korrigieren? –

Antwort

1

Orange's answer und die Kommentare zu Ihrer Frage Kommentaren korrekt sind; Sie verwenden (vermutlich) Python 3, wobei dict.values() eine dictionary view object anstelle einer list zurückgibt und die index()-Funktion nicht bereitstellt.


Es scheint jedoch, dass Sie jeden Code separat wieder auf den ursprünglichen Charakter zu kartieren suchen. Hierzu ist es viel sauberer zu dem Decoder vorge berechnen:

def invert(dico): 
    # map values to keys, note the nested comprehension 
    return {i: k for k, v in dico.items() for i in v} 

def decipher(code, dico): 
    # note that this result can be cached or even just 
    # computed outside the function 
    decoder = invert(dico) 

    # pass each code through the decoder map 
    return [decoder[c] for c in code] 

print decipher([1, 9, 108], { 
    'A': [1, 9], 
    'B': [12, 19], 
    'C': [78, 108] 
}) 

die

['A', 'A', 'C'] 
+0

Diese Lösung wird für mich nicht funktionieren, fürchte ich. Der Wert wird als verschlüsselter Buchstabe verwendet, und ich muss in der Lage sein, den Buchstaben auf EINE Nummer zu setzen, nicht auf die ganze Liste. –

+0

Verstanden (obwohl beachten Sie, dass Ihr Code mit Orange Korrektur wird das gleiche wie meine). Meinst du, dass "1" und "9" in dem obigen Wörterbuch beide "A" zugeordnet werden müssen? –

+0

Genau. So werde ich die Nachricht entschlüsseln. (Ich verschlüssele es mit dem gleichen Wörterbuch). –

0

index ist eine Funktion von list, nicht von dict_values Objekt zurückgegeben von dico.values(). Also, Ihren Code ändern, so dass dico.values() in eine Liste umgewandelt wird:

def déchiffrement(code,dico): 
    taille3 = len(code) 
    décodé = [] 
    for i in range(taille3): 
     décodé.insert(i, dico.keys()[list(dico.values()).index(code[i])]) # Changed here 
    return décodé 
+1

Es ist erwähnenswert, dass es im Code anderer Leute funktionieren könnte, da 'dico.values ​​()' in Python2 eine Liste zurückgeben würde. – zondo

+0

Ist das ein Unterschied zu Python 3? Mein 'Typ (mydict.values ​​())' ist ' ' ... edit: Ich war 15sek zu spät :) – Ilja

+0

Es wird nicht die Tatsache beeinflussen, dass ich die Schlüssel extrahieren muss? Edit: Versuchte es, sagen Sie mir einen Wert ich Suche ist nicht in der Liste, aber es ist. –

Verwandte Themen