如何将一个python字典附加到另一个字典,如果两个字典中的不同键具有重叠值,则数据不会被修改,而是按原样保留?此外,这必须在for循环中完成,该循环将在每次迭代时返回一个新字典。因此,我们的想法是创建一个最终的主字典,其中包含循环返回的所有字典。
类似于:
finaldict = dict()
for - some loop condition:
dict1 = function-call()
finaldict = finaldict + dict1
access 'finaldict' outside the loop. 'finaldict' should now contain all the returned 'dict1's.这两个字典需要连接的方式如下:
finaldict = {22: [7, 9, 8]}
dict1 = {23: [7, 9, 8, 6, 12]}期望的结果是:
finaldict = {22: [7, 9, 8], 23: [7, 9, 8, 6, 12]}如何在python中以最快的方式实现这一点?
发布于 2020-04-27 13:44:01
如果您看到列表值发生了变化,那么您的函数很可能总是返回相同的list对象,而不是在不同的时间返回不同的列表。即使您将列表保留在要合并的字典之外,您也会发现旧列表中的值与您期望的值不同。
你可以在下面的代码中看到这种行为:
_lst = [] # this is an implementation detail of the function below
def foo():
"""returns a steadily longer list of "foo" strings"""
_lst.append('foo')
return _lst
print(foo()) # prints ['foo']
print(foo()) # prints ['foo', 'foo'], all as expected so far
x = foo()
print(x) # prints ['foo', 'foo', 'foo'], fine
y = foo()
print(y) # prints ['foo', 'foo', 'foo', foo'], fine here too
print(x) # prints ['foo', 'foo', 'foo', foo'], unexpectedly changed!当再次调用foo来分配y时,您可能会惊讶于x的值是如何变化的。但前提是您没有意识到x和y都是对同一个列表对象_lst的引用(如果您不知道foo函数是如何实现的,那么您可能不知道这一点)。
在您的代码中,您的函数以与foo相同的方式返回相同的列表(尽管它周围有一个字典,因此不那么明显)。如果您控制该函数,则可以对其进行更改,使其每次都返回一个新列表。在我的示例中,这可能类似于:
def foo():
_lst.append('foo')
return list(_lst) # return a shallow copy of the list!您的代码可能会稍微复杂一点,但可能不会太复杂。只需确保你为你返回的每一本字典都做了一个新的列表。
另一方面,如果你不能修改这个函数(可能是因为它是一个库的一部分或者别的什么),当你去合并字典时,你可以自己制作副本。
finaldict = dict()
while some_condition():
dict1 = function_call()
finaldict.update((key, list(value)) for key, value in dict1.items())我们传递给dict.update的生成器表达式产生key, value元组,但是值是我们从function_call获得的字典中列表的浅副本。
发布于 2020-04-27 12:34:21
您可以使用update函数来执行以下操作:
In [21]: finaldict = {22: [7, 9, 8]}
...: dict1 = {23: [7, 9, 8, 6, 12]}
In [22]:
In [22]: finaldict.update(dict1)
In [23]: finaldict
Out[23]: {22: [7, 9, 8], 23: [7, 9, 8, 6, 12]}
In [24]:发布于 2020-04-27 13:23:03
一个简单的解决方案(Python3.5),带有前缀运算符**,用于按键值(PEP448)解压缩字典。
>>> {**dict1, **finaldict}
{23: [7, 9, 8, 6, 12], 22: [7, 9, 8]}https://stackoverflow.com/questions/61451761
复制相似问题