Création d'un nouveau dictionnaire en Python


454

Je veux construire un dictionnaire en Python. Cependant, tous les exemples que je vois instancient un dictionnaire à partir d'une liste, etc. ..

Comment créer un nouveau dictionnaire vide en Python?

Réponses:


661

Appel dictsans paramètres

new_dict = dict()

ou écrivez simplement

new_dict = {}

39
Y a-t-il une différence entre dict () et {}? Ou les gens préfèrent-ils simplement l'un plutôt que l'autre?
Matt

52
@ Matt Apparemment, CPython 2.7 dict () est plus lent (6 fois plus lent?), Voir: doughellmann.com/2012/11/… En tout cas, je commence de toute façon à préférer la syntaxe du constructeur car je trouve plus facile de taper et de déplacer du code entre les dict et les appels de fonction.
David Wheaton

16
Je confirme qu'il est 3 fois plus rapide d'utiliser {} que dict () en python 3.x
Alex Azazel

8
Oui, je suis environ 4 fois plus rapide en python 3.6 pour {}plus dict()et 5 fois pour []plus list().
Michael Hall

10
Dans la grande majorité des cas, cela n'a pas d'importance si cela prend six fois plus de temps, car cela reste un temps incroyablement petit.
hypehuman

247

Tu peux le faire

x = {}
x['a'] = 1

107
+1 pour la prochaine question logique sur la façon d'y ajouter un nouvel élément
Matt Klein

27

Il est également utile de savoir comment écrire un dictionnaire prédéfini:

cmap =  {'US':'USA','GB':'Great Britain'}

# Explicitly:
# -----------
def cxlate(country):
    try:
        ret = cmap[country]
    except KeyError:
        ret = '?'
    return ret

present = 'US' # this one is in the dict
missing = 'RU' # this one is not

print cxlate(present) # == USA
print cxlate(missing) # == ?

# or, much more simply as suggested below:

print cmap.get(present,'?') # == USA
print cmap.get(missing,'?') # == ?

# with country codes, you might prefer to return the original on failure:

print cmap.get(present,present) # == USA
print cmap.get(missing,missing) # == RU

4
Bon point! Mais je pense que le peu avec cxlaterend votre réponse trop compliquée. Je garderais juste la partie initialisation. ( cxlatelui-même est trop compliqué. Vous pourriez juste return cmap.get(country, '?').)
Daniel Darabos

Envisagez d'utiliser docs.python.org/2/library/… au lieu d'écrire une fonction de traduction ou d'utiliser .get () partout.
Sparr

1
Peut-être que je le ferais, sauf que la documentation est absolument opaque pour moi - c'est terrible. Je n'ai aucune idée de ce qu'ils me disent de faire, ni pourquoi je devrais le faire. Et .get () semble faire exactement la bonne chose - en plus, il est extrêmement flexible. Je suis sûr que c'est un manque de compréhension de ma part. Dans cet esprit, mes questions sont: pourquoi s'embêter? Qu'est-ce qui est enregistré ici, plus facile ici, plus rapide ici, etc.? L'avantage est exactement quoi?
fyngyrz

1
Sans rapport, mais vous devez explicitement attraper le KeyErrorau lieu d'un bare except (ce qui attraperait des choses telles que KeyboardInterruptet SystemExit).
Arnav Borborah

Arnav, oui, bien sûr, vous avez raison. Modifié en conséquence. Je vous remercie!
fyngyrz

19
>>> dict(a=2,b=4)
{'a': 2, 'b': 4}

Ajoutera la valeur dans le dictionnaire python.


15
d = dict()

ou

d = {}

ou

import types
d = types.DictType.__new__(types.DictType, (), {})

Quelle est la différence entre types.DictType.__new__(types.DictType, (), {})et juste{}

2
Pour tous ceux qui lisent ceci: la dernière "solution" est un peu une blague - vous pouvez l' utiliser (en python 2.x au moins - ne fonctionnera pas dans py3k), mais personne dans son esprit ne voudra jamais faire donc ;-)
bruno desthuilliers

6

Il y a donc 2 façons de créer un dict:

  1. my_dict = dict()

  2. my_dict = {}

Mais sur ces deux options {}est plus efficace que dict()plus lisible. VÉRIFIER ICI


4
>>> dict.fromkeys(['a','b','c'],[1,2,3])


{'a': [1, 2, 3], 'b': [1, 2, 3], 'c': [1, 2, 3]}

la question indique que le dictionnaire devrait être une nouvelle instance vide
Wesam
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.