|
1
7602
词典
解释假设您有两个词典,并且希望在不更改原始词典的情况下将它们合并到新词典中:
PEP 448 和 available as of Python 3.5
这确实是一个单一的表达。 请注意,我们也可以使用文字符号合并:
现在:
它现在显示为在 release schedule for 3.5, PEP 478 现在,它已经进入了市场 What's New in Python 3.5 但是,由于许多组织仍然使用Python2,因此您可能希望以向后兼容的方式执行此操作。Python2和Python3.0-3.4中提供的经典Python方法是通过两个步骤完成:
在这两种方法中,
单一表达式如果您还没有使用Python3.5或需要编写向后兼容的代码,并且希望在 单一表达式
然后有一个表达式:
您还可以创建一个函数来合并任意数量的字典,从零到非常大的数字:
对其他答案的评论不要使用您在以前接受的答案中看到的内容:
在Python2中,为每个dict在内存中创建两个列表,在内存中创建第三个列表,其长度等于前两个列表的长度,然后丢弃所有三个列表以创建dict。
在Python3中,这将失败
因为你加了两个
此示例演示了值不可损坏时发生的情况:
下面是一个例子
这使用
下面是一个用法的示例 remediated in django .
字典用于获取哈希键(例如。
mailing list 语言的创造者Guido van Rossum写道:
和
这是我的理解(以及对
creator of the language
)这是它的预期用途
而不是
对评论的答复
同样,当键不是字符串时,它不适用于3。隐式调用约定是名称空间采用普通字典,而用户只能传递字符串形式的关键字参数。所有其他Callable都强制执行它。
考虑到其他Python实现(PyPy、Jython、IronPython),这种不一致性是很糟糕的。因此,它在Python3中得到了修复,因为这种用法可能是一个突破性的变化。 我认为,故意编写只在一种语言的一个版本中工作或只在特定的任意约束下工作的代码是恶意的无能。 更多评论:
我的答复是:
对我必须让你回到这个问题上来,这个问题要求你回答一个问题 浅的 合并 二 假设有两个字典,其中一个可能会在单个函数中递归地合并它们,但是您应该小心不要修改来自任何一个源的字典,避免这种情况的最可靠的方法是在赋值时创建一个副本。由于键必须是可散列的,因此通常是不可变的,因此复制它们是毫无意义的:
用法:
my answer to the canonical question on a "Dictionaries of dictionaries merge" . 性能较差但正确的Ad HOC
他们会的
性能优于
您还可以手动将字典链接到 dict comprehension :
或者在Python 2.6中(可能早在2.4中引入生成器表达式时):
性能分析我只想对已知行为正确的用法进行性能分析。(独立,因此您可以自己复制和粘贴。)
在Python 3.8.1中,NixOS:
|
|
|
2
1717
在您的情况下,您可以做的是:
这将,正如你所希望的那样,把最后的格言放进去
如果使用Python2,甚至可以删除
|
|
|
3
697
另一种选择:
|
|
|
4
396
笔记
:这已成为一个流行的答案,但重要的是要指出,如果
|
|
5
248
这可能不是一个流行的答案,但您几乎肯定不想这样做。如果需要合并的副本,请使用copy(或 deepcopy 此外,当您使用.items()(Python 3.0之前的版本)时,您正在创建一个新列表,其中包含来自dict的项。如果您的字典很大,那么这将是相当大的开销(创建合并的dict后将立即丢弃两个大列表)。update()可以更高效地工作,因为它可以逐项运行第二个dict。 依据 time :
在我看来,由于可读性,前两者之间的微小减速是值得的。此外,用于创建字典的关键字参数仅在Python2.3中添加,而copy()和update()将在旧版本中使用。 |
|
|
6
181
在后续回答中,您询问了这两个备选方案的相对性能:
示例1:将20个连续整数映射到自身的相同字典:
示例2:将252个短字符串映射为整数的非重叠字典,反之亦然:
在比较了这两者之后,我想知道
一些快速测试,例如。
让我得出这样的结论
这一讨论仍然缺少一些重要的内容,即将这些备选方案与合并两个列表的“明显”方式进行性能比较:使用
一个典型的结果是:
换句话说,,
事实上,我甚至认为纯Python代码不可能做得比这更好。如果您可以在C扩展模块中做得更好,我想Python人员可能会对将您的代码(或方法的变体)合并到Python核心中感兴趣。Python使用
你也可以这样写
|
|
|
7
168
在Python 3.0及更高版本中
:你可以使用 PEP 448 扩展字典打包和解包。这既快又简单:
Python 3.9及更高版本的更新 :您可以使用 PEP 584 工会经营者:
|
|
|
8
145
我想要类似的东西,但是能够指定如何合并重复键上的值,所以我破解了这个问题(但没有对它进行大量测试)。显然,这不是一个单一的表达式,而是一个单一的函数调用。
|
|
|
9
115
递归/深度更新dict
感谢rednaw的编辑。 |
|
|
10
92
在Python3.9中,还将|和|=与下面的PEP 584示例一起使用
|
|
|
11
89
在不使用copy的情况下,我认为最好的版本是:
它比我快
就我个人而言,我最喜欢这个版本,因为它用一个函数语法很好地描述了我想要的东西。唯一的一个小问题是,它并没有完全清楚地表明y的值优先于x的值,但我认为这并不难理解。 |
|
|
12
85
对于两个字典('b')中都有键的项,您可以通过最后一个来控制输出中的键。 |
|
|
13
64
这个问题已经回答了好几次了,, 这个问题的简单解决方案尚未列出。
它和上面提到的z0和邪恶的z2一样快,但是很容易理解和改变。 |
|
|
14
60
在这些阴暗而可疑的答案中,这个光辉的例子是唯一一个用Python合并dicts的好方法,它得到了独裁者终身支持 吉多·范罗苏姆 他自己其他人提出了其中的一半,但没有将其放入函数中。
|
|
|
15
53
如果你认为兰姆达斯是邪恶的,那就不要再读下去了。
如上所述,使用两行或编写函数可能是更好的方法。 |
|
|
16
46
|
|
|
17
41
在python3中
无论如何,我更喜欢这种表示法,因为将其视为集合并集操作而不是串联(如标题所示)似乎更为自然。 编辑:
Python3还有几点。首先,请注意
answer 非常优雅,因为它可以接受任意数量的dict作为参数,但是 from the docs 它看起来像是按顺序查找每个查找的所有DICT的列表:
如果在应用程序中有大量查找,这可能会降低您的速度:
所以查找速度要慢一个数量级。我是Chainmap的粉丝,但在可能有很多查找的地方看起来不太实用。 |
|
|
18
32
两本字典
N 字典
|
|
|
19
31
它的用法是:
|
|
|
20
29
滥用导致一个表达式的解决方案 Matthew's answer :
你说你想要一个表情,所以我骂了你
|
|
|
21
24
尽管答案对这个很有帮助 浅的 dictionary,这里定义的所有方法实际上都没有进行深度dictionary合并。
人们会期待这样的结果:
相反,我们得到的是:
如果“一”条目确实是一个合并条目,那么它的字典中应该有“depth_2”和“extra”作为条目。 同时使用链也不起作用:
结果:
rcwesick给出的深度合并也产生了相同的结果。 是的,合并示例词典是可行的,但它们都不是通用的合并机制。一旦我编写了一个进行真正合并的方法,我将在以后更新它。 |
|
|
22
22
如果你不介意变异的话
知道
标准库中的大多数变异方法(如
如果你没有
尽管它与下面使用的新walrus操作符(仅限Python 3.8+)没有太大区别,
如果你真的想要一份,
PEP 584
风格
|
|
|
23
18
New
在Python 3.9中:
使用联合运算符(
对于匹配的键
这也适用于
|
|
|
24
17
示例:
|
|
|
25
17
(仅适用于Python2.7*;Python3*有更简单的解决方案) 如果您不反对导入标准库模块,您可以这样做
(修订)
|
|
|
26
16
根据这里和其他地方的想法,我理解了一个函数:
你可以用lambda来代替。 |
|
|
27
16
到目前为止,我所列出的解决方案的问题是,在合并字典中,键“b”的值是10,但按照我的想法,它应该是12。 有鉴于此,我提出以下几点:
结果:
|
|
|
28
15
这应该能解决你的问题。 |
|
29
15
scheduled for 20 October, 2019
PEP 572: Assignment Expressions
. 新的赋值表达式运算符
致:
总的来说,我不鼓励这种方法,而是赞成:
which you should
),根本不需要结果的名称(因此,在构造立即传递给函数或包含在
但在C层,使用混凝土
它还具有更大的扩展性,如合并三个
使用赋值表达式不会像这样缩放;你能得到的最接近的答案是:
或者没有
其中任何一个都显然要丑陋得多,并包括进一步的低效率(要么是浪费的临时资源)
赋值表达式方法的唯一真正优势在于:
|
|
|
30
12
这可以通过一次听写理解来完成:
|