合并具有共同键最小值的字典

9

我有两个字典,我希望将它们合并成一个字典,使得合并后的字典中每个键对应的值都是在原始两个字典中该键对应的值中的最小值。

h1 = {"a":3, "b":5, "c":2}
h2 = {"a":1, "c":5, "d":10}

result = merge(h1, h2) = {"a":1, "b":5, "c":2, "d":10}

有没有一个很酷的一行代码可以实现这个功能?如果没有,那么最优雅的方法是什么?
2个回答

7

您可以这样做

>>> {k: min(i for i in (h1.get(k), h2.get(k)) if i) for k in h1.viewkeys() | h2}
{'a': 1, 'c': 2, 'b': 5, 'd': 10}

h1.viewkeys() | h2 实际上是找到了集合的并集,并获取所有在 h1 或者 h2 中的键。然后,我们找到了 `h1` 和 `h2` 中相应键的最小值。

如果你正在使用 Python 3.x,那么你只需要使用 keys,像这样:

>>> {k : min(i for i in (h1.get(k), h2.get(k)) if i is not None) for k in h1.keys() | h2}
{'d': 10, 'a': 1, 'b': 5, 'c': 2}

注意:上述展示的像集合一样的操作之所以有效,是因为它们确实像集合一样。引用官方文档
键视图类似于集合,因为它们的条目是唯一且可哈希的。如果所有值都是可哈希的,使得(键,值)对是唯一且可哈希的,则项视图也是类似于集合的。(由于条目通常不唯一,因此值视图不被视为类似于集合的)

它已经没有比这更优雅的了!谢谢 - nish
1
这个逻辑在 i 为 0 时跳过了键,因为 0 是 False。 - pratik_bhavsar
if i 替换为 if i is not None 可以允许 0 值,这一点反映在编辑中。 - dcsuka

-1

你也可以试试这个:

>>> {k: min(h1.get(k) or h2[k], h2.get(k) or h1[k]) for k in (h1.keys() + h2.keys())} 
{'a': 1, 'c': 2, 'b': 5, 'd': 10}

1
你不能执行 h1.keys() + h2.keys() - styvane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接