python:在字典中添加新密钥?

在Python字典创建之后,是否可以向它添加一个键?它似乎没有.add()方法。


1
2
3
4
5
6
d = {'key':'value'}
print(d)
# {'key': 'value'}
d['mynewkey'] = 'mynewvalue'
print(d)
# {'mynewkey': 'mynewvalue', 'key': 'value'}


1
2
3
4
5
6
7
>>> x = {1:2}
>>> print x
{1: 2}

>>> x.update({3:4})
>>> print x
{1: 2, 3: 4}


我想整合关于Python字典的信息:

创建一个空字典

1
2
3
data = {}
# OR
data = dict()

创建一个初始值的字典

1
2
3
4
5
data = {'a':1,'b':2,'c':3}
# OR
data = dict(a=1, b=2, c=3)
# OR
data = {k: v for k, v in (('a', 1),('b',2),('c',3))}

插入/更新单个值

1
2
3
4
5
6
7
data['a']=1  # Updates if 'a' exists, else adds 'a'
# OR
data.update({'a':1})
# OR
data.update(dict(a=1))
# OR
data.update(a=1)

插入/更新多个值

1
data.update({'c':3,'d':4})  # Updates 'c' and adds 'd'

在不修改原始代码的情况下创建合并字典

1
2
3
data3 = {}
data3.update(data)  # Modifies data3, not data
data3.update(data2)  # Modifies data3, not data2

删除字典中的条目

1
2
3
del data[key]  # Removes specific element in a dictionary
data.pop(key)  # Removes the key & returns the value
data.clear()  # Clears entire dictionary

检查一个键是否已经在字典中

1
key in data

在字典中遍历对

1
2
3
4
for key in data: # Iterates just through the keys, ignoring the values
for key, value in d.items(): # Iterates through the pairs
for key in d.keys(): # Iterates just through key, ignoring the values
for value in d.values(): # Iterates just through value, ignoring the keys

从2个列表中创建一个字典

1
data = dict(zip(list_with_keys, list_with_values))

请随意添加更多!


是的,很简单。只需要做以下事情:

1
dict["key"] ="value"

"Is it possible to add a key to a Python dictionary after it has been created? It doesn't seem to have an .add() method."

是的,这是可能的,它确实有一个实现这个的方法,但是你不想直接使用它。

为了演示如何以及如何不使用它,让我们创建一个带有dict文字的空dict, {}:

1
my_dict = {}

最佳实践1:下标符号

要用一个新的键和值更新这个dict,可以使用下标符号(请参阅这里的映射),它提供了项分配:

1
my_dict['new key'] = 'new value'

my_dict现在:

1
{'new key': 'new value'}

最佳实践2:update方法- 2种方法

我们还可以使用update方法高效地更新具有多个值的dict。我们可能不必要地在这里创建一个额外的dict,所以我们希望我们的dict已经创建,并且来自或用于其他目的:

1
my_dict.update({'key 2': 'value 2', 'key 3': 'value 3'})

my_dict现在:

1
{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value'}

这样做的另一个有效的方式与关键字参数与更新方法,但由于它们必须是合法的python语言,你不能有空格或特殊符号或启动的名字与号码,但许多人认为这更可读的方式来创建密钥dict,这里我们当然避免创建一个额外的不必要的dict:

1
my_dict.update(foo='bar', foo2='baz')

my_dict现在是:

1
2
{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value',
 'foo': 'bar', 'foo2': 'baz'}

现在我们已经介绍了三种python方法来更新dict

魔术方法,__setitem__,以及为什么应该避免

还有一种方法可以更新不应该使用的dict,它使用__setitem__方法。下面是一个如何使用__setitem__方法向dict添加键值对的例子,并演示了使用它的糟糕性能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>>> d = {}
>>> d.__setitem__('foo', 'bar')
>>> d
{'foo': 'bar'}


>>> def f():
...     d = {}
...     for i in xrange(100):
...         d['foo'] = i
...
>>> def g():
...     d = {}
...     for i in xrange(100):
...         d.__setitem__('foo', i)
...
>>> import timeit
>>> number = 100
>>> min(timeit.repeat(f, number=number))
0.0020880699157714844
>>> min(timeit.repeat(g, number=number))
0.005071878433227539

因此,我们看到使用下标符号实际上比使用__setitem__快得多。做python式的事情,也就是说,按照预期的方式使用该语言,通常可读性更强,计算效率更高。


1
dictionary[key] = value


如果想在字典中添加字典,可以这样做。

例如:在你的字典中添加一个新条目;子词典

1
2
3
4
5
6
7
8
9
10
dictionary = {}
dictionary["new key"] ="some new entry" # add new dictionary entry
dictionary["dictionary_within_a_dictionary"] = {} # this is required by python
dictionary["dictionary_within_a_dictionary"]["sub_dict"] = {"other" :"dictionary
<div class="
suo-content">[collapse title=""]<ul><li>这和php.net手册页中的大多数评论一样,与所问的问题无关。</li><li>没有什么可以阻止您这样做:<wyn>dictionary = {"dictionary_within_a_dictionary": {"sub_dict": {"other" :"dictionary"}}}</wyn>(或者如果<wyn>dictionary</wyn>已经是一个dict,那么<wyn>dictionary["dictionary_within_a_dictionary"] = {"sub_dict": {"other" :"dictionary"}}</wyn>)</li></ul>[/collapse]</div><hr>
<p>
The orthodox syntax is <wyn>d[key] = value</wyn>, but if your keyboard is missing the square bracket keys you could do:
</p>

[cc lang="
python"]d.__setitem__(key, value)

实际上,定义__getitem____setitem__方法是使您自己的类支持方括号语法的方法。参见http://www.diveintopython.net/object_oriented_framework/special_class_methods.html


这个流行的问题涉及合并字典ab的函数方法。

下面是一些更简单的方法(在python3中测试过)…

1
2
3
c = dict( a, **b ) ## see also https://stackoverflow.com/q/2255878
c = dict( list(a.items()) + list(b.items()) )
c = dict( i for d in [a,b] for i in d.items() )

注意:上面的第一个方法只适用于b中的键是字符串的情况。

要添加或修改单个元素,b字典将只包含该元素…

1
c = dict( a, **{'d':'dog'} ) ## returns a dictionary based on 'a'

这相当于……

1
2
3
4
5
6
def functional_dict_add( dictionary, key, value ):
   temp = dictionary.copy()
   temp[key] = value
   return temp

c = functional_dict_add( a, 'd', 'dog' )


你可以创建一个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class myDict(dict):

    def __init__(self):
        self = dict()

    def add(self, key, value):
        self[key] = value

## example

myd = myDict()
myd.add('apples',6)
myd.add('bananas',3)
print(myd)

给了

1
2
>>>
{'apples': 6, 'bananas': 3}

假设您希望生活在一个不可变的世界中,并且不希望修改原始值,而是希望创建一个新的dict,该dict是向原始值添加一个新键的结果。

在Python 3.5+中,你可以:

1
2
params = {'a': 1, 'b': 2}
new_params = {**params, **{'c': 3}}

Python 2的等价版本是:

1
2
params = {'a': 1, 'b': 2}
new_params = dict(params, **{'c': 3})

在这之后:

params仍然等于{'a': 1, 'b': 2}

new_params等于{'a': 1, 'b': 2, 'c': 3}

有时候,您不想修改原始文件(您只想要添加到原始文件中的结果)。我发现这是一个令人耳目一新的替代方案如下:

1
2
3
params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params['c'] = 3

1
2
3
params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params.update({'c': 3})

参考:https://stackoverflow.com/a/2255892/514866


那么多的答案,但每个人仍然忘记了那个奇怪的名字,奇怪的行为,但仍然很方便的名字。

1
value = my_dict.setdefault(key, default)

基本上就是这样做的:

1
2
3
4
try:
    value = my_dict[key]
except KeyError: # key not found
    value = my_dict[key] = default

如。

1
2
3
4
5
6
7
8
9
10
>>> mydict = {'a':1, 'b':2, 'c':3}
>>> mydict.setdefault('d', 4)
4 # returns new value at mydict['d']
>>> print(mydict)
{'a':1, 'b':2, 'c':3, 'd':4} # a new key/value pair was indeed added
# but see what happens when trying it on an existing key...
>>> mydict.setdefault('a', 111)
1 # old value was returned
>>> print(mydict)
{'a':1, 'b':2, 'c':3, 'd':4} # existing key was ignored

你可以用dict.update(Iterable_Sequence of key:value)

例子:

1
wordFreqDic.update( {'before' : 23} )


首先检查密钥是否已经存在

1
2
3
4
5
a={1:2,3:4}
a.get(1)
2
a.get(5)
None

然后可以添加新键和值


如果您没有加入两个字典,而是将新的键值对添加到字典中,那么使用下标符号似乎是最好的方法。

1
2
3
4
5
6
7
import timeit

timeit.timeit('dictionary = {"karga": 1,"darga": 2}; dictionary.update({"aaa": 123123,"asd": 233})')
>> 0.49582505226135254

timeit.timeit('dictionary = {"karga": 1,"darga": 2}; dictionary["aaa"] = 123123; dictionary["asd"] = 233;')
>> 0.20782899856567383

但是,如果您想添加成千上万个新的键值对,您应该考虑使用update()方法。