it-swarm.dev

Python dictionary.keys () Fehler

Ich versuche, die Funktion .keys() zu verwenden und stattdessen eine Liste der Tasten abzurufen, die in der Vergangenheit immer vorgekommen sind. Wie auch immer, ich verstehe das.

b = { 'video':0, 'music':23 }
k = b.keys()
print( k[0] )

>>>TypeError: 'dict_keys' object does not support indexing

print( k )
dict_keys(['music', 'video'])

es sollte nur ["Musik", "Video"] drucken, es sei denn, ich werde verrückt.

Was ist los?

42
tokageKitayama

Python 3 hat das Verhalten von dict.keys Dahingehend geändert, dass es jetzt ein dict_keys - Objekt zurückgibt, das iterierbar, aber nicht indizierbar ist (es ist wie das alte dict.iterkeys, Das jetzt weg ist). Sie können das Ergebnis Python 2 mit einem expliziten Aufruf von list zurückholen:

>>> b = { 'video':0, 'music':23 }
>>> k = list(b.keys())
>>> k
['music', 'video']

oder nur

>>> list(b)
['music', 'video']
91
Fred Foo

Wenn Sie k wie folgt zugewiesen haben:

k = list(b.keys())

ihr Code wird funktionieren.

Wie der Fehler sagt, ist der dict_keys Typ unterstützt keine Indizierung.

8
NPE

Dies ist eine der wichtigsten Änderungen zwischen Python 2 und 3.

In Python 2:

>>> help(dict.keys)
keys(...)
    D.keys() -> list of D's keys

In Python 3:

>>> help(dict.keys)
keys(...)
    D.keys() -> a set-like object providing a view on D's keys

Diese Verhaltensänderung ist sehr sinnvoll, da ein Diktat semantisch ungeordnet ist und seine Schlüssel eindeutig sind - genau wie ein Satz.

Diese Änderung bedeutet, dass Sie nicht jedes Mal eine neue Liste von Schlüsseln erstellen müssen, wenn Sie eine Art Satzvergleich mit den Schlüsseln eines Diktats durchführen möchten.

Gleiches Verhalten in 2 und 3

Um den Übergang zu Python 3 zu erleichtern, hat Python 2.7 eine andere Diktiermethode, viewkeys. Die viewkeys -Methode ist am ähnlichsten zur Python 3's dict.keys Methode:

>>> d
{'a': None, 'c': None, 'b': None, 'd': None}
>>> for k in d.viewkeys(): print k
... 
a
c
b
d
>>> d.viewkeys() & set('abc')
set(['a', 'c', 'b'])

In Python 3 besteht das nächste Analogon zum alten Verhalten darin, dict.keys() an list zu übergeben:

>>> d
{'d': None, 'a': None, 'c': None, 'b': None}
>>> list(d.keys())
['d', 'a', 'c', 'b']

Oder übergeben Sie einfach das Diktat an list, da ein Diktat sowieso über seine Schlüssel iteriert:

>>> list(d)
['d', 'a', 'c', 'b']

Sie können Dienstprogrammfunktionen erstellen, um das Verhalten über 2 und 3 zu abstrahieren:

if hasattr(dict, 'viewkeys'): # Python 2.7
    def keys(d):
        return d.viewkeys()
else:  # Python 3
    def keys(d):
        return d.keys()

Übergeben Sie ein Diktat an list, um das Listenformular abzurufen. In 2 und 3 erhalten Sie dieselbe Ausgabe:

>>> d
{'b': None, 'a': None, 'c': None, 'd': None}
>>> keys(d)
dict_keys(['b', 'a', 'c', 'd'])
>>> list(d)
['b', 'a', 'c', 'd']
2
Aaron Hall

Wenn Sie einfach eine Liste von Schlüsseln aus einem Wörterbuch wünschen, können Sie dies direkt tun:

b = {"name": "xyz", "class":"abc", "college": "qwert"}  
key_list = list(b)

key_list enthält alle Schlüsselnamen als Liste, wobei ein Schlüssel nicht wiederholt wird, wenn er mehr als einmal gefunden wird. Doppelte Schlüssel werden als einer gezählt.

0
vikas0713