【发布时间】:2020-04-08 22:26:53
【问题描述】:
我有
dict1 = {a: 1, b: 2, c: 3}
dict2 = {b: 3, c: 2}
如何合并 dict1 和 dict2 以便结果 dict3 将具有 {a: 1, b: 3, c: 3} 我知道我们可以像这样 dict3 = {**a, **b} 进行合并,但是我必须在任何地方写一个条件才能解决我的问题吗?
【问题讨论】:
标签: python
我有
dict1 = {a: 1, b: 2, c: 3}
dict2 = {b: 3, c: 2}
如何合并 dict1 和 dict2 以便结果 dict3 将具有 {a: 1, b: 3, c: 3} 我知道我们可以像这样 dict3 = {**a, **b} 进行合并,但是我必须在任何地方写一个条件才能解决我的问题吗?
【问题讨论】:
标签: python
给你:
dict1 = {"a": 1, "b": 2, "c": 3}
dict2 = {"b": 3, "c": 2}
result = {}
for k in dict1.keys() | dict2.keys():
result[k] = max(dict1.get(k, float('-inf')), dict2.get(k,float('-inf')))
print(result)
我正在使用默认值:dict1.get(k, DEFAULT) 并使用按位 OR 运算符 | 连接两个键集。
请注意,float('-inf') 的默认值表示结果为
dict1 = {"a": -1, "b": 2, "c": 3}
dict2 = {"b": -5, "c": 2}```
变成{'a': -1, 'b': 2, 'c': 3}。
而默认的0 你会得到
{'b': 2, 'c': 3, 'a': 0}
这两种方式都可以被视为同样有效的响应。
【讨论】:
float('-inf') 移出循环来加快速度。 (回复your comment)
您可以将 dict 项合并到一个元组序列中,对它们进行排序,然后使用 dict 构造函数从排序后的序列中创建一个新的 dict,以便具有相同键但具有更高值的项将覆盖那些具有较低的值:
dict(sorted((*dict1.items(), *dict2.items())))
【讨论】:
n 上大于 100 不会终止:) repl.it/repls/StaleFluffyNotifications
timeit 的number 参数,因为您使用的是更大的n:repl.it/@blhsing/StaleFluffyNotifications
您可以简单地遍历它们并比较值,然后使用dict.setdefault(key, 0) 绕过未设置的值。
dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'b': 3, 'c': 2}
dict3 = {}
for d in dict1, dict2:
for k, v in d.items():
if v > dict3.setdefault(k, 0):
dict3[k] = v
print(dict3) # -> {'a': 1, 'b': 3, 'c': 3}
defaultdict(int) 也可以,但我想避免导入。
【讨论】:
float('-inf') 会是一个更好的默认值,idk