532 Stimmen

Python-Wörterbuch-Verständnis

Ist es möglich, ein Wörterbuchverständnis in Python zu erstellen (für die Schlüssel)?

Ohne Listenkomplexe können Sie etwas wie dieses verwenden:

l = []
for n in range(1, 11):
    l.append(n)

Wir können dies auf ein Listenverständnis verkürzen: l = [n for n in range(1, 11)] .

Angenommen, ich möchte die Schlüssel eines Wörterbuchs auf denselben Wert setzen. Das kann ich tun:

d = {}
for n in range(1, 11):
     d[n] = True # same value for each

Ich habe das ausprobiert:

d = {}
d[i for i in range(1, 11)] = True

Ich erhalte jedoch eine SyntaxError über die for .

Außerdem (ich brauche diesen Teil nicht, aber ich frage mich nur), können Sie die Schlüssel eines Wörterbuchs auf eine Reihe von verschiedenen Werten setzen, wie dies:

d = {}
for n in range(1, 11):
    d[n] = n

Ist dies mit einem Wörterbuchverständnis möglich?

d = {}
d[i for i in range(1, 11)] = [x for x in range(1, 11)]

Dies wirft auch eine SyntaxError über die for .

702voto

BrenBarn Punkte 228691

Es gibt Wörterbuchauffassungen in Python 2.7+ aber sie funktionieren nicht ganz so, wie Sie es versuchen. Wie ein Listenverständnis erzeugen sie eine neu Wörterbuch; Sie können sie nicht verwenden, um Schlüssel zu einem bestehenden Wörterbuch hinzuzufügen. Außerdem müssen Sie die Schlüssel und Werte angeben, obwohl Sie natürlich auch einen Dummy-Wert angeben können, wenn Sie möchten.

>>> d = {n: n**2 for n in range(5)}
>>> print d
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Wenn Sie sie alle auf True setzen wollen:

>>> d = {n: True for n in range(5)}
>>> print d
{0: True, 1: True, 2: True, 3: True, 4: True}

Was Sie zu fragen scheinen, ist ein Weg, um mehrere Schlüssel auf einmal auf ein bestehendes Wörterbuch zu setzen. Dafür gibt es keine direkte Abkürzung. Sie können entweder eine Schleife machen, wie Sie bereits gezeigt haben, oder Sie könnten ein Wörterbuchverständnis verwenden, um ein neues Diktat mit den neuen Werten zu erstellen, und dann Folgendes tun oldDict.update(newDict) um die neuen Werte in das alte Diktat einzufügen.

174voto

mgilson Punkte 280928

Sie können die dict.fromkeys Klasse Methode ...

>>> dict.fromkeys(range(5), True)
{0: True, 1: True, 2: True, 3: True, 4: True}

Dies ist der schnellste Weg, um ein Wörterbuch zu erstellen, bei dem alle Schlüssel demselben Wert zugeordnet sind.

Aber do no dies mit veränderlichen Objekten verwenden :

d = dict.fromkeys(range(5), [])
# {0: [], 1: [], 2: [], 3: [], 4: []}
d[1].append(2)
# {0: [2], 1: [2], 2: [2], 3: [2], 4: [2]} !!!

Wenn Sie nicht tatsächlich necesita um alle Schlüssel zu initialisieren, eine defaultdict könnte ebenfalls nützlich sein:

from collections import defaultdict
d = defaultdict(True)

Um den zweiten Teil zu beantworten, ist ein Diktat-Verständnis genau das Richtige für Sie:

{k: k for k in range(10)}

Sie sollten dies wahrscheinlich nicht tun, aber Sie könnten auch eine Unterklasse von dict das ähnlich funktioniert wie ein defaultdict wenn Sie überschreiben __missing__ :

>>> class KeyDict(dict):
...    def __missing__(self, key):
...       #self[key] = key  # Maybe add this also?
...       return key
... 
>>> d = KeyDict()
>>> d[1]
1
>>> d[2]
2
>>> d[3]
3
>>> print(d)
{}

35voto

NPE Punkte 462670
>>> {i:i for i in range(1, 11)}
{1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10}

34voto

ehontz Punkte 1040

Der Kommentar von @mgilson gefällt mir sehr gut, denn wenn man zwei Iterables hat, von denen eine den Schlüsseln und die andere den Werten entspricht, kann man auch folgendes tun.

keys = ['a', 'b', 'c']
values = [1, 2, 3]
d = dict(zip(keys, values))

Geben

d = {'a': 1, 'b': 2, 'c': 3}

15voto

adonese Punkte 160

Zählen Sie zum Beispiel das Vorkommen von Wörtern in einer Liste anhand des Wörterbuchverständnisses

my_list = ['hello', 'hi', 'hello', 'today', 'morning', 'again', 'hello']
my_dict = {k:my_list.count(k) for k in my_list}
print(my_dict)

Und das Ergebnis ist

{'again': 1, 'hi': 1, 'hello': 3, 'today': 1, 'morning': 1}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X