用Python创建新字典


453

我想用Python建立字典。但是,我看到的所有示例都是从列表中实例化字典等。..

如何在Python中创建一个新的空字典?

Answers:


661

dict无参数调用

new_dict = dict()

或简单地写

new_dict = {}

39
dict()和{}之间有什么区别吗?还是人们只喜欢一个而不是另一个?
马特

51
@ Matt显然CPython 2.7 dict()慢一些(慢6倍?),请参见:oughellmann.com/2012/11/…无论如何,由于我发现键入和移动代码更容易,所以无论如何我还是开始偏爱构造函数语法在字典和函数调用之间。
大卫•惠顿

16
我确认在Python 3.x中使用{}比dict()快3倍
Alex Azazel

8
是的,在python 3.6中,我获得的速度快了大约4倍,而在{}over中获得了dict()5倍的[]速度list()
迈克尔·霍尔

10
在大多数情况下,是否需要花费六倍的时间并不重要,因为那仍然是很少的时间。
hypehuman

247

你可以这样做

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

107
对于下一个逻辑问题+1,该逻辑问题如何向其中添加新元素
Matt Klein

27

知道如何编写预设字典对了解也很有帮助:

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
好点子!但我认为,这样cxlate会使您的回答显得过于复杂。我只保留初始化部分。(cxlate本身太复杂了。您可以return cmap.get(country, '?')。)
Daniel Darabos 2015年

考虑使用docs.python.org/2/library/…而不是编写转换函数或在各处使用.get()。
Sparr

1
也许我会的,除了文档对我来说绝对是不透明的-这太糟糕了。我不知道他们告诉我做什么,或者为什么我应该这样做。.get()似乎做对了正确的事情-而且它非常灵活。我敢肯定我缺乏理解。考虑到这一点,我的问题是:为什么要打扰?在这里保存了什么,在这里更方便,在这里更快,等等?好处到底是什么?
fyngyrz

1
无关,但是您应该显式地捕获KeyError而不是裸除(它将捕获诸如KeyboardInterruptSystemExit)。
阿尔纳夫·博尔博拉

Arnav,是的,您当然是对的。进行了相应的编辑。谢谢!
fyngyrz


15
d = dict()

要么

d = {}

要么

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

types.DictType.__new__(types.DictType, (), {})和just和有什么不一样?{}

2
对于任何阅读此书的人:最后一个“解决方案”是个玩笑-您可以使用它(至少在python 2.x中-在py3k中不起作用),但没有人会想做因此;-)
bruno desthuilliers

6

因此,有两种创建字典的方法:

  1. my_dict = dict()

  2. my_dict = {}

但是,在这两个选项{}中,比dict()加上其可读性更有效。 在这里检查


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.