2010-05-17 8 views
138

Ich mache mir etwas Mühe, Python zu lernen, und ich achte sehr auf gängige Codierungsstandards. Dies mag wie eine sinnlose Frage erscheinen, aber ich versuche mich auf Best Practices zu konzentrieren, so wie ich es lerne, so dass ich keine "schlechten" Gewohnheiten verlernen muss.Was ist die bevorzugte Syntax für die Initialisierung eines Diktats: geschweifte Klammerliterale {} oder die Funktion dict()?

Ich sehe zwei gängige Methoden zur Initialisierung eines dict:

a = { 
    'a': 'value', 
    'another': 'value', 
} 

b = dict( 
    a='value', 
    another='value', 
) 

, die es zu "mehr pythonic" betrachtet wird? Was benutzt du? Warum?

+4

Welches Tutorial verwenden Sie? Wo haben Sie Beispiele gesehen, die zu Verwirrung geführt haben? –

+2

Nun, ich habe das Python-Tutorial, tauchen Sie in Python und dann eine Vielzahl von Blogs, SO-Posts und andere Google-Ressourcen. Die offizielle Dokumentation verwendet '{}' ziemlich einheitlich, aber ich sehe eine Menge des expliziten 'dict()' Ansatzes an anderer Stelle. Ich konnte den Vorteil einer expliziten Syntax sehen, aber das Fehlen der Vorgehensweise in den offiziellen Dokumenten machte mich misstrauisch.Nachdem ich das gepostet habe, habe ich die Bibliotheksdokumente für 'dict' angeschaut und festgestellt, dass Schlüssel gültige Bezeichner sein müssen, wenn ein explizites' dict' verwendet wird, um ein Diktat zu initialisieren. – daotoad

+2

Wie ist "dict()" expliziter als "{}"? Ich verstehe deine Verwirrung nicht. Beide scheinen mir explizit zu sein. Können Sie ein Zitat oder eine Referenz angeben, die Sie dazu bringen zu sagen, dass "dict" "explizit" und "{}" nicht explizit ist? Woher kommt diese Unterscheidung? –

Antwort

162

Lockige Zahnspange. Das Übergeben von Schlüsselwortargumenten an dict(), obwohl es in vielen Szenarien sehr gut funktioniert, kann eine Zuordnung nur initialisieren, wenn die Schlüssel gültige Python-IDs sind.

Mit anderen Worten kann es nicht tun:

a = {'import': 'trade', 1: 7.8} 
65

Die ersten geschweiften Klammern. Andernfalls stoßen Sie auf Konsistenzprobleme mit Schlüsseln, die ungerade Zeichen enthalten, wie =.

# Works fine. 
a = { 
    'a': 'value', 
    'b=c': 'value', 
} 

# Eeep! Breaks if trying to be consistent. 
b = dict( 
    a='value', 
    b=c='value', 
) 
+3

Dies ist genau der Grund, warum man die dict() - Methode für die Initialisierung bevorzugen könnte. Sie zwingt die Wörterbuchschlüssel dazu, gültige Bezeichner zu sein, so dass sie beispielsweise mit ** kwargs kompatibel sind und Schlüssel gültige Attributnamen sind. – RufusVS

46

Die erste Version ist vorzuziehen:

  • Es ist für alle Arten von Schlüsseln arbeitet, so können Sie zum Beispiel sagen {1: 'one', 2: 'two'}. Die zweite Variante funktioniert nur für (einige) String-Schlüssel. Die Verwendung unterschiedlicher Arten von Syntax abhängig vom Typ der Schlüssel wäre eine unnötige Inkonsistenz.
  • Es ist schneller:

    $ python -m timeit "dict(a='value', another='value')" 
    1000000 loops, best of 3: 0.79 usec per loop 
    $ python -m timeit "{'a': 'value','another': 'value'}" 
    1000000 loops, best of 3: 0.305 usec per loop 
    
  • Wenn die spezielle Syntax für Literale Wörterbuch nicht verwendet werden sollte, wäre es wahrscheinlich nicht existieren.
3

Ich denke, die erste Option ist besser, weil Sie die Werte als [ ‚a‘] oder ein [ ‚anderen‘] zugreifen wollen. Die Schlüssel in Ihrem Wörterbuch sind Strings und es gibt keinen Grund vorzugeben, dass sie es nicht sind. Die Keyword-Syntax sieht für mich zunächst clever aus, ist aber bei einem zweiten Blick unklar. Das ergibt nur Sinn für mich, wenn Sie mit arbeiten, und die Schlüsselwörter werden später Attribute, so etwas.

2

FYI, falls Sie Ihrem Wörterbuch Attribute hinzufügen müssen (Dinge, die an das Wörterbuch angehängt sind, aber nicht zu den Schlüsseln gehören), dann benötigen Sie das zweite Formular. In diesem Fall können Sie Ihr Wörterbuch mit Schlüssel mit beliebigen Zeichen, einer nach dem anderen initialisieren, etwa so:

class mydict(dict): pass 
    a = mydict()   
    a["b=c"] = 'value' 
    a.test = False 
0

Manchmal ist dict() eine gute Wahl:

a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)])) 

mydict=dict(zip(['mon','tue','wed','thu','fri','sat','sun'], 

[random.randint (0.100) für x im Bereich (0,7)]))

+2

Es gibt eine Enumerate-Funktion, die das besser machen könnte. In diesem Fall gibt es einen Enum-Typ, der das, was Sie hier tun, besser machen kann. Auch das ist keine wirkliche Antwort auf die Frage. – dusktreader

Verwandte Themen