En utilisant PyCharm, j'ai remarqué qu'il propose de convertir un dict littéral :
d = {
'one': '1',
'two': '2',
}
dans un constructeur de dict :
d = dict(one='1', two='2')
Ces différentes approches diffèrent-elles de manière significative?
(En écrivant cette question, j'ai remarqué qu'il dict()
est impossible de spécifier une clé numérique à l' aide ... d = {1: 'one', 2: 'two'}
est possible, mais, évidemment, dict(1='one' ...)
ne l'est pas. Autre chose?)
python
dictionary
pycharm
maligree
la source
la source
dict()
prend une liste de paires clé-valeur ainsi que d'autoriser les paramètres nommés, afin qu'il puisse utiliser utilisé pour créer tout type de dict, mais pas avec la syntaxe que vous utilisez. Cela ne vaut probablement rien non plus qu'il y avait un bogue ( youtrack.jetbrains.net/issue/PY-2512 ) dans pyCharm spécifiquement à cause de ce que vous avez découvert, qui a été corrigé).dict(abc = 123)
constructeur produit un dictionnaire avec des clés de chaîne d'octets'abc'
, ce qui peut être surprenant si vous utilisezunicode_literals
et attendez que les clés de dictionnaire soient unicodeu'abc'
. Voir stackoverflow.com/questions/20357210/… .Réponses:
Je pense que vous avez souligné la différence la plus évidente. Mis à part cela,
le premier n'a pas besoin de rechercher
dict
ce qui devrait le rendre un peu plus rapidele second regarde
dict
danslocals()
puisglobals()
et les trouvailles BUILTIN, de sorte que vous pouvez changer le comportement en définissant un local appelédict
par exemple , bien que je ne peux pas penser à n'importe où ce serait une bonne idée à part peut - être quand le débogagela source
Le littéral est beaucoup plus rapide, car il utilise les opcodes BUILD_MAP et STORE_MAP optimisés plutôt que CALL_FUNCTION générique:
la source
Ils sont à peu près les mêmes sur Python 3.2.
Comme l'a souligné gnibbler, le premier n'a pas besoin de chercher
dict
, ce qui devrait le rendre un peu plus rapide.la source
$ 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
Ces deux approches produisent des dictionnaires identiques, sauf, comme vous l'avez noté, où les règles lexicales de Python interfèrent.
Les littéraux de dictionnaire sont un peu plus évidemment des dictionnaires, et vous pouvez créer n'importe quel type de clé, mais vous devez citer les noms des clés. D'un autre côté, vous pouvez utiliser des variables pour les clés si vous en avez besoin pour une raison quelconque:
Le
dict()
constructeur vous donne plus de flexibilité en raison de la variété des formes d'entrée qu'il faut. Par exemple, vous pouvez lui fournir un itérateur de paires, et il les traitera comme des paires clé / valeur.Je ne sais pas pourquoi PyCharm offrirait de convertir un formulaire en un autre.
la source
Une grande différence avec python 3.4 + pycharm est que le constructeur dict () génère un message "erreur de syntaxe" si le nombre de clés dépasse 256.
Je préfère utiliser le dict littéral maintenant.
la source
À partir du didacticiel python 2.7:
Tandis que:
Donc, {} et dict () produisent tous les deux un dictionnaire mais offrent des moyens un peu différents d'initialisation des données du dictionnaire.
la source
Je trouve le dict littéral
d = {'one': '1'}
beaucoup plus lisible, vos données de définition, plutôt que d'attribuer des valeurs et de les envoyer audict()
constructeur.D'un autre côté, j'ai vu des gens mal saisir le littéral dict comme
d = {'one', '1'}
lequel en python moderne 2.7+ créerait un ensemble.Malgré cela, je préfère toujours utiliser littéralement l'ensemble parce que je pense que sa préférence personnelle est plus lisible, je suppose.
la source
set
s existe. Je souhaite qu'il y ait une syntaxe littérale pour les dictés ordonnés ... je suis sûr que je les utilise plus souvent que les ensembles.le littéral dict () est bien quand vous copiez des valeurs collées à partir d'autre chose (aucun python) Par exemple une liste de variables d'environnement. si vous aviez un fichier bash, dites
vous pouvez facilement coller ensuite dans un
dict()
littéral et ajouter des commentaires. Il est également plus facile de faire le contraire, de copier dans autre chose. Alors que la{'FOO': 'bar'}
syntaxe est assez unique pour python et json. Donc, si vous utilisez beaucoup json, vous voudrez peut-être utiliser des{}
littéraux avec des guillemets doubles.la source
Il n'y a pas de littéral dict pour créer des classes héritées de dict, des classes dict personnalisées avec des méthodes supplémentaires. Dans ce cas, un constructeur de classe dict personnalisé doit être utilisé, par exemple:
la source
Tenez également compte du fait que les jetons qui correspondent aux opérateurs ne peuvent pas être utilisés dans la syntaxe du constructeur, c'est-à-dire les clés dasherisées.
la source