Bei der Verwendung von PyCharm ist mir aufgefallen, dass es die Konvertierung eines Dikt-Literals bietet :
d = {
'one': '1',
'two': '2',
}
in einen Diktatkonstruktor :
d = dict(one='1', two='2')
Unterscheiden sich diese unterschiedlichen Ansätze in signifikanter Weise?
(Während ich diese Frage schrieb, bemerkte ich, dass dict()
es unmöglich erscheint, einen numerischen Schlüssel anzugeben. Dies d = {1: 'one', 2: 'two'}
ist möglich, aber offensichtlich dict(1='one' ...)
nicht. Sonst noch etwas?)
python
dictionary
pycharm
bösartig
quelle
quelle
dict()
Nimmt eine Liste von Schlüssel-Wert-Paaren und lässt benannte Parameter zu, sodass damit jede Art von Diktat erstellt werden kann, nur nicht mit der von Ihnen verwendeten Syntax. Es ist wahrscheinlich auch nichts wert, dass in pyCharm ein Fehler ( youtrack.jetbrains.net/issue/PY-2512 ) aufgetreten ist, insbesondere aufgrund dessen, was Sie entdeckt haben und der behoben wurde.dict(abc = 123)
Konstruktor ein Wörterbuch mit Byte-String-Schlüsseln. Dies'abc'
kann überraschend sein, wenn Sieunicode_literals
Wörterbuchschlüssel verwenden und erwarten, dass sie Unicode sindu'abc'
. Siehe stackoverflow.com/questions/20357210/… .Antworten:
Ich denke, Sie haben auf den offensichtlichsten Unterschied hingewiesen. Abgesehen davon,
Das erste muss nicht nachgeschlagen werden,
dict
was es ein bisschen schneller machen sollteDer zweite schaut
dict
nachlocals()
und dannglobals()
und findet den eingebauten, so dass Sie das Verhalten ändern können, indem Sie beispielsweise einen lokalen Namen definieren,dict
obwohl ich mir nirgendwo vorstellen kann, dass dies eine gute Idee wäre, außer vielleicht beim Debuggenquelle
Literal ist viel schneller, da es optimierte BUILD_MAP- und STORE_MAP-Opcodes anstelle der generischen CALL_FUNCTION verwendet:
quelle
Sie sehen in Python 3.2 ziemlich gleich aus.
Wie Gnibbler betonte, muss der erste nicht nachschlagen
dict
, was es ein bisschen schneller machen sollte.quelle
$ pypy -m perf timeit -l '1000000' -n '5' -s 'i=(("a",1), ("b", 2), ("c", 3))' "{'a': 1, 'b': 2, 'c': 3}" ....... Mean +- std dev: 1.73 ns +- 0.14 ns $ pypy -m perf timeit -l '1000000' -n '5' -s 'i=(("a",1), ("b", 2), ("c", 3))' '{k:v for k,v in i}' ....... Mean +- std dev: 139 ns +- 10 ns $ pypy -m perf timeit -l '1000000' -n '5' -s 'i=(("a",1), ("b", 2), ("c", 3))' 'dict(i)' ....... Mean +- std dev: 188 ns +- 16 ns
Diese beiden Ansätze erzeugen identische Wörterbücher, außer wie Sie bemerkt haben, wo die lexikalischen Regeln von Python interferieren.
Wörterbuchliterale sind etwas offensichtlicher Wörterbücher, und Sie können jede Art von Schlüssel erstellen, aber Sie müssen die Schlüsselnamen zitieren. Auf der anderen Seite können Sie Variablen für Schlüssel verwenden, wenn Sie dies aus irgendeinem Grund benötigen:
Der
dict()
Konstruktor bietet Ihnen mehr Flexibilität aufgrund der Vielzahl der Eingabeformen. Sie können ihm beispielsweise einen Iterator von Paaren bereitstellen, der sie als Schlüssel / Wert-Paare behandelt.Ich habe keine Ahnung, warum PyCharm anbieten würde, ein Formular in das andere zu konvertieren.
quelle
Ein großer Unterschied zu Python 3.4 + Pycharm besteht darin, dass der Konstruktor dict () eine Meldung "Syntaxfehler" ausgibt, wenn die Anzahl der Schlüssel 256 überschreitet.
Ich bevorzuge es jetzt, das Diktal zu verwenden.
quelle
Aus Python 2.7 Tutorial:
Während:
Sowohl {} als auch dict () erzeugen also ein Wörterbuch, bieten jedoch etwas unterschiedliche Möglichkeiten für die Initialisierung von Wörterbuchdaten.
quelle
Ich finde, dass das Dikt-Literal
d = {'one': '1'}
viel besser lesbar ist, Ihre Daten zu definieren, anstatt Dinge Werte zuzuweisen und sie an dendict()
Konstruktor zu senden .Auf der anderen Seite habe ich Leute gesehen, die das Dikt-Literal
d = {'one', '1'}
falsch geschrieben haben, als ob in modernem Python 2.7+ eine Menge erstellt wird.Trotzdem bevorzuge ich es immer noch, das Set-Literal auf alle Arten zu verwenden, weil ich denke, dass es lesbarer und persönlicher ist, nehme ich an.
quelle
set
s existiert. Ich wünschte, es gäbe eine wörtliche Syntax für geordnete Diktate ... ziemlich sicher, dass ich sie häufiger als Sätze verwende.Das dictal-Literal ist hilfreich, wenn Sie Einfügewerte von etwas anderem kopieren (keine Python). Zum Beispiel eine Liste von Umgebungsvariablen. Wenn Sie eine Bash-Datei hatten, sagen Sie
Sie können dann einfach in ein
dict()
Literal einfügen und Kommentare hinzufügen. Es macht es auch einfacher, das Gegenteil zu tun und in etwas anderes zu kopieren. Während die{'FOO': 'bar'}
Syntax für Python und JSON ziemlich einzigartig ist. Wenn Sie also häufig json verwenden, möchten Sie möglicherweise{}
Literale mit doppelten Anführungszeichen verwenden.quelle
Es gibt kein Dikt-Literal zum Erstellen von von Dikt geerbten Klassen, benutzerdefinierte Dikt-Klassen mit zusätzlichen Methoden. In diesem Fall sollte ein benutzerdefinierter Konstruktor für die Diktatklasse verwendet werden, zum Beispiel:
quelle
Berücksichtigen Sie auch die Tatsache, dass Token, die mit Operatoren übereinstimmen, nicht in der Konstruktorsyntax verwendet werden können, dh dasherisierte Schlüssel.
quelle