首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将一个python字典附加到另一个,同时保持它们的键值不变?

如何将一个python字典附加到另一个,同时保持它们的键值不变?
EN

Stack Overflow用户
提问于 2020-04-27 12:31:07
回答 3查看 2.4K关注 0票数 2

如何将一个python字典附加到另一个字典,如果两个字典中的不同键具有重叠值,则数据不会被修改,而是按原样保留?此外,这必须在for循环中完成,该循环将在每次迭代时返回一个新字典。因此,我们的想法是创建一个最终的主字典,其中包含循环返回的所有字典。

类似于:

代码语言:javascript
复制
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.

这两个字典需要连接的方式如下:

代码语言:javascript
复制
finaldict = {22: [7, 9, 8]}
dict1 = {23: [7, 9, 8, 6, 12]}

期望的结果是:

代码语言:javascript
复制
finaldict = {22: [7, 9, 8], 23: [7, 9, 8, 6, 12]}

如何在python中以最快的方式实现这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-27 13:44:01

如果您看到列表值发生了变化,那么您的函数很可能总是返回相同的list对象,而不是在不同的时间返回不同的列表。即使您将列表保留在要合并的字典之外,您也会发现旧列表中的值与您期望的值不同。

你可以在下面的代码中看到这种行为:

代码语言:javascript
复制
_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的值是如何变化的。但前提是您没有意识到xy都是对同一个列表对象_lst的引用(如果您不知道foo函数是如何实现的,那么您可能不知道这一点)。

在您的代码中,您的函数以与foo相同的方式返回相同的列表(尽管它周围有一个字典,因此不那么明显)。如果您控制该函数,则可以对其进行更改,使其每次都返回一个新列表。在我的示例中,这可能类似于:

代码语言:javascript
复制
def foo():
    _lst.append('foo')
    return list(_lst)    # return a shallow copy of the list!

您的代码可能会稍微复杂一点,但可能不会太复杂。只需确保你为你返回的每一本字典都做了一个新的列表。

另一方面,如果你不能修改这个函数(可能是因为它是一个库的一部分或者别的什么),当你去合并字典时,你可以自己制作副本。

代码语言:javascript
复制
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获得的字典中列表的浅副本。

票数 2
EN

Stack Overflow用户

发布于 2020-04-27 12:34:21

您可以使用update函数来执行以下操作:

代码语言:javascript
复制
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]:
票数 3
EN

Stack Overflow用户

发布于 2020-04-27 13:23:03

一个简单的解决方案(Python3.5),带有前缀运算符**,用于按键值(PEP448)解压缩字典。

代码语言:javascript
复制
>>> {**dict1, **finaldict}
{23: [7, 9, 8, 6, 12], 22: [7, 9, 8]}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61451761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档