如何向字典添加新键?

如何向现有字典添加键?它没有.add()方法。

5066297 次浏览
dictionary[key] = value

您可以通过为该键分配一个值来在字典上创建一个新的键/值对

d = {'key': 'value'}print(d)  # {'key': 'value'}
d['mynewkey'] = 'mynewvalue'
print(d)  # {'key': 'value', 'mynewkey': 'mynewvalue'}

如果键不存在,则添加它并指向该值。如果它存在,则覆盖它指向的当前值。

要同时添加多个键,请使用#0

>>> x = {1:2}>>> print(x){1: 2}
>>> d = {3:4, 5:6, 7:8}>>> x.update(d)>>> print(x){1: 2, 3: 4, 5: 6, 7: 8}

对于添加单个键,接受的答案具有较少的计算开销。

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

创建空字典

data = {}# ORdata = dict()

创建具有初始值的字典

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

插入/更新单个值

data['a'] = 1  # Updates if 'a' exists, else adds 'a'# ORdata.update({'a': 1})# ORdata.update(dict(a=1))# ORdata.update(a=1)

插入/更新多个值

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

Python 3.9+:

更新操作符|=现在适用于字典:

data |= {'c':3,'d':4}

创建合并字典而不修改原件

data3 = {}data3.update(data)  # Modifies data3, not datadata3.update(data2)  # Modifies data3, not data2

Python 3.5+:

这使用了一个名为字典解压缩的新功能。

data = {**data1, **data2, **data3}

Python 3.9+:

合并操作符|现在适用于字典:

data = data1 | {'c':3,'d':4}

删除字典中的项目

del data[key]  # Removes specific element in a dictionarydata.pop(key)  # Removes the key & returns the valuedata.clear()  # Clears entire dictionary

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

key in data

在字典中遍历对

for key in data: # Iterates just through the keys, ignoring the valuesfor key, value in d.items(): # Iterates through the pairsfor key in d.keys(): # Iterates just through key, ignoring the valuesfor value in d.values(): # Iterates just through value, ignoring the keys

从两个列表创建字典

data = dict(zip(list_with_keys, list_with_values))

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

示例:向您的字典和子字典添加新条目

dictionary = {}dictionary["new key"] = "some new entry" # add new dictionary entrydictionary["dictionary_within_a_dictionary"] = {} # this is required by pythondictionary["dictionary_within_a_dictionary"]["sub_dict"] = {"other" : "dictionary"}print (dictionary)

输出:

{'new key': 'some new entry', 'dictionary_within_a_dictionary': {'sub_dict': {'other': 'dictionarly'}}}

注: Python要求你首先添加一个sub

dictionary["dictionary_within_a_dictionary"] = {}

添加条目之前。

传统的语法是d[key] = value,但是如果你的键盘缺少方括号键,你也可以这样做:

d.__setitem__(key, value)

事实上,定义__getitem____setitem__方法是使您自己的类支持方括号语法的方法。参见深入学习Python,像字典一样工作的类

你可以创建一个:

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}

这个受欢迎的问题解决了功能合并字典ab的方法。

以下是一些更直接的方法(在Python 3中测试过)…

c = dict( a, **b ) ## see also https://stackoverflow.com/q/2255878c = 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] = valuereturn temp
c = functional_dict_add( a, 'd', 'dog' )

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

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

为了演示如何以及如何不使用它,让我们创建一个空的字典字面量,{}

my_dict = {}

最佳实践1:下标符号

要使用单个新键和值更新此字典,您可以使用下标符号(参见此处的映射)提供项赋值:

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

my_dict现在:

{'new key': 'new value'}

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

我们还可以使用#0方法有效地使用多个值更新字典。我们可能在这里不必要地创建了一个额外的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'}

使用更新方法执行此操作的另一种有效方法是使用关键字参数,但由于它们必须是合法的python单词,因此不能有空格或特殊符号,也不能以数字开头名称,但许多人认为这是为字典创建键的更具可读性的方法,在这里我们当然可以避免创建额外的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'}

所以现在我们已经介绍了三种Pythonic方式来更新dict


神奇的方法,__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的事情,即以预期的方式使用语言,通常既可读又计算效率更高。

还有一个奇怪的名字,奇怪的行为,但仍然方便#0

这个

value = my_dict.setdefault(key, default)

基本上就是这样做的:

try:value = my_dict[key]except KeyError: # key not foundvalue = 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}

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

有时候你不想修改原始(你只想要添加到原始的结果)。我发现这是一个令人耳目一新的替代以下内容:

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

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

参考:"**"是什么意思,在表达式'字典(d1,**d2)'?

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

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()方法。

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

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

然后您可以添加新的键和值。

我认为指出Python的#0模块也很有用,它由许多有用的字典子类和包装器组成,可以简化在字典中添加和修改数据类型,特别是#1

调用工厂函数来提供缺失值的字典子类

如果您使用始终包含相同数据类型或结构的字典,例如列表字典,这尤其有用。

>>> from collections import defaultdict>>> example = defaultdict(int)>>> example['key'] += 1>>> example['key']defaultdict(<class 'int'>, {'key': 1})

如果键还不存在,defaultdict将给出的值(在我们的例子中为10)作为字典的初始值(通常用于循环内部)。因此,此操作做了两件事:将一个新键添加到字典中(根据问题),如果键尚不存在,则分配值。对于标准字典,这将引发错误,因为+=操作试图访问尚不存在的值:

>>> example = dict()>>> example['key'] += 1Traceback (most recent call last):File "<stdin>", line 1, in <module>KeyError: 'key'

如果不使用defaultdict,添加新元素的代码量会大得多,可能看起来像这样:

# This type of code would often be inside a loopif 'key' not in example:example['key'] = 0  # add key and initial value to dict; could also be a listexample['key'] += 1  # this is implementing a counter

defaultdict也可以用于复杂的数据类型,例如listset

>>> example = defaultdict(list)>>> example['key'].append(1)>>> exampledefaultdict(<class 'list'>, {'key': [1]})

添加元素会自动初始化列表。

这是我在这里没有看到的另一种方式:

>>> foo = dict(a=1,b=2)>>> foo{'a': 1, 'b': 2}>>> goo = dict(c=3,**foo)>>> goo{'c': 3, 'a': 1, 'b': 2}

您可以使用字典构造函数和隐式扩展来重建字典。此外,有趣的是,这种方法可以用来控制字典构造过程中的位置顺序(发布Python 3.6)。事实上,Python 3.7及更高版本保证了插入顺序!

>>> foo = dict(a=1,b=2,c=3,d=4)>>> new_dict = {k: v for k, v in list(foo.items())[:2]}>>> new_dict{'a': 1, 'b': 2}>>> new_dict.update(newvalue=99)>>> new_dict{'a': 1, 'b': 2, 'newvalue': 99}>>> new_dict.update({k: v for k, v in list(foo.items())[2:]})>>> new_dict{'a': 1, 'b': 2, 'newvalue': 99, 'c': 3, 'd': 4}>>>

以上是使用字典理解。

添加字典(键,值)类。

class myDict(dict):
def __init__(self):self = dict()
def add(self, key, value):#self[key] = value # add new key and value overwriting any exiting same keyif self.get(key)!=None:print('key', key, 'already used') # report if key already usedself.setdefault(key, value) # if key exit do nothing

## example
myd = myDict()name = "fred"
myd.add('apples',6)print('\n', myd)myd.add('bananas',3)print('\n', myd)myd.add('jack', 7)print('\n', myd)myd.add(name, myd)print('\n', myd)myd.add('apples', 23)print('\n', myd)myd.add(name, 2)print(myd)

这个问题已经得到了令人作呕的回答,但是自从我注释获得了很大的牵引力,这里是一个答案:

在不更新现有字典的情况下添加新密钥

如果你在这里试图弄清楚如何添加一个键并返回一个新的字典(不修改现有的字典),你可以使用下面的技术来做到这一点

python>=3.5

new_dict = {**mydict, 'new_key': new_val}

python<3.5

new_dict = dict(mydict, new_key=new_val)

请注意,使用这种方法,您的键需要遵循python中的有效标识符名称规则

在不使用add的情况下向字典添加键

        # Inserting/Updating single value# subscript notation methodd['mynewkey'] = 'mynewvalue' # Updates if 'a' exists, else adds 'a'# ORd.update({'mynewkey': 'mynewvalue'})# ORd.update(dict('mynewkey'='mynewvalue'))# ORd.update('mynewkey'='mynewvalue')print(d)  # {'key': 'value', 'mynewkey': 'mynewvalue'}# To add/update multiple keys simultaneously, use d.update():x = {3:4, 5:6, 7:8}d.update(x)print(d) # {'key': 'value', 'mynewkey': 'mynewvalue', 3: 4, 5: 6, 7: 8}# update operator |= now works for dictionaries:d |= {'c':3,'d':4}# Assigning new key value pair using dictionary unpacking.data1 = {4:6, 9:10, 17:20}data2 = {20:30, 32:48, 90:100}data3 = { 38:"value", 99:"notvalid"}d = {**data1, **data2, **data3}# The merge operator | now works for dictionaries:data = data1 | {'c':3,'d':4}# Create a dictionary from two listsdata = dict(zip(list_with_keys, list_with_values))

dico["new key"]="value"