如何向现有词典中添加关键字?它没有.add()方法。
当前回答
还有一个名字奇怪,行为怪异,但仍然很方便的dict.setdefault()。
This
value = my_dict.setdefault(key, default)
基本上就是这样:
try:
value = my_dict[key]
except KeyError: # key not found
value = my_dict[key] = default
例如。,
>>> 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,这是向原来的内容添加新密钥的结果。
在Python 3.5+中,您可以执行以下操作:
params = {'a': 1, 'b': 2}
new_params = {**params, **{'c': 3}}
Python 2的等价物是:
params = {'a': 1, 'b': 2}
new_params = dict(params, **{'c': 3})
在执行以下任一操作之后:
params仍然等于{‘a‘:1,‘b‘:2}
and
new_params等于{‘a‘:1,‘b‘:2,‘c‘:3}
有时您不想修改原始文件(您只想得到添加到原始文件的结果)。我觉得这是一个令人耳目一新的替代方案:
params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params['c'] = 3
or
params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params.update({'c': 3})
参考文献:在表达式“dict(d1,**d2)”中,“**”是什么意思?
还有一个名字奇怪,行为怪异,但仍然很方便的dict.setdefault()。
This
value = my_dict.setdefault(key, default)
基本上就是这样:
try:
value = my_dict[key]
except KeyError: # key not found
value = my_dict[key] = default
例如。,
>>> 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
“是否可以在Python字典创建后向其添加键?它似乎没有.add()方法。”
是的,这是可能的,它确实有一个实现这一点的方法,但您不想直接使用它。
为了演示如何使用和如何不使用它,让我们使用dict文本{}创建一个空dict:
my_dict = {}
最佳实践1:下标表示法
要用一个新的键和值更新此dict,可以使用提供项分配的下标表示法(请参阅此处的映射):
my_dict['new key'] = 'new value'
my_dict现在是:
{'new key': 'new value'}
最佳实践2:更新方法-2种方式
我们还可以使用更新方法高效地使用多个值更新dict。我们可能在这里不必要地创建了一个额外的dict,所以我们希望我们的dict已经创建,并且来自或用于其他目的:
my_dict.update({'key 2': 'value 2', 'key 3': 'value 3'})
my_dict现在是:
{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value'}
使用update方法实现这一点的另一种有效方法是使用关键字参数,但由于它们必须是合法的python单词,因此不能使用空格或特殊符号,也不能以数字开头名称,但许多人认为这是为dict创建键的更易读的方法,在这里我们当然避免创建额外的不必要的dict:
my_dict.update(foo='bar', foo2='baz')
my_dict现在是:
{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value',
'foo': 'bar', 'foo2': 'baz'}
因此,现在我们已经介绍了三种Python方式来更新字典。
魔术方法__setitem__,以及为什么应该避免它
还有另一种不应该使用的更新dict的方法,它使用__setitem__方法。下面是一个如何使用__setitem__方法向dict添加键值对的示例,以及使用它的糟糕性能的演示:
>>> 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__快得多。做Pythonic的事情,也就是说,按照预期的方式使用语言,通常既可读性更高,计算效率也更高。
这个流行的问题涉及合并字典a和b的函数方法。
下面是一些更简单的方法(在Python 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字典将仅包含该元素。。。
c = dict( a, **{'d':'dog'} ) ## returns a dictionary based on 'a'
这相当于。。。
def functional_dict_add( dictionary, key, value ):
temp = dictionary.copy()
temp[key] = value
return temp
c = functional_dict_add( a, 'd', 'dog' )
您可以创建一个:
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)
给予:
>>>
{'apples': 6, 'bananas': 3}
推荐文章
- 在每个列表元素上调用int()函数?
- 当使用代码存储库时,如何引用资源的相对路径
- 如何在Flask-SQLAlchemy中按id删除记录
- 在Python中插入列表的第一个位置
- Python Pandas只合并某些列
- 如何在一行中连接两个集而不使用“|”
- 从字符串中移除前缀
- 代码结束时发出警报
- 如何在Python中按字母顺序排序字符串中的字母
- 在matplotlib中将y轴标签添加到次要y轴
- 如何消除数独方块的凹凸缺陷?
- 为什么出现这个UnboundLocalError(闭包)?
- 使用Python请求的异步请求
- 如何检查一个对象是否是python中的生成器对象?
- 如何从Python包内读取(静态)文件?