用相同的键组合两个或多个字典

Rah*_*rma 5 python dictionary list-comprehension python-3.x

我有两个字典项目u_items

items = {"A": 1, "B": 2, "C": 3}

u_items = {"D": 4, "B": 4, "E": 8, "C": 4}
Run Code Online (Sandbox Code Playgroud)

我想用u_items更新项目字典,所以我这样做了

items.update((k + '_1' if k in items else k, v) for k, v in u_items.items())
Run Code Online (Sandbox Code Playgroud)

这样我就可以区分两个字典的键

输出:

items = {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'B_1': 4, 'E': 8, 'C_1': 4}
Run Code Online (Sandbox Code Playgroud)

但是当我用另一个字典更新项目字典时,假设n_items,它将替换B_1的值而不是使其变为B_1_1

n_items = {"C":7, "B":9}

items.update((k + '_1' if k in items else k, v) for k, v in n_items.items())
Run Code Online (Sandbox Code Playgroud)

输出:

{'A': 1, 'B': 2, 'C': 3, 'D': 4, 'B_1': 9, 'E': 8, 'C_1': 7}
Run Code Online (Sandbox Code Playgroud)

但我希望输出是这样的:

{'A': 1, 'B': 2, 'C': 3, 'D': 4, 'B_1': 4, 'E': 8, 'C_1': 4, 'B_1_1':9,'C_1_1':7}
Run Code Online (Sandbox Code Playgroud)

或像这样:

{'A': 1, 'B': 2, 'C': 3, 'D': 4, 'B_1': 4, 'E': 8, 'C_1': 4, 'B_2':9,'C_2':7}
Run Code Online (Sandbox Code Playgroud)

我该怎么做 ?

Cri*_*ati 1

虽然这看起来有点像XY Problem,但这是一个丑陋的(而且我很确定,效率低下)而且不是非常通用的解决方案,包括:

按照您的要求,通过将“ _1 ”附加到现有键(在一行中完成所有操作)来合并字典,尽管我建议(因为在某些情况下最短不一定是最好的):

  • 使用函数(避免重复代码(表达式))
  • 子类化dict并覆盖其update方法(前一个方法的更好变体)
>>> items = {"A": 1, "B": 2, "C": 3}
>>> u_items = {"D": 4, "B": 4, "E": 8, "C": 4}
>>> n_items = {"C": 7, "B": 9}
>>>
>>> items.update((max([k1 + "_1" for k1 in items if k1 == k or k1.startswith(k + "_1")], key=len, default=k), v) for k, v in u_items.items())
>>> items
{'A': 1, 'B': 2, 'C': 3, 'D': 4, 'B_1': 4, 'E': 8, 'C_1': 4}
>>>
>>> items.update((max([k1 + "_1" for k1 in items if k1 == k or k1.startswith(k + "_1")], key=len, default=k), v) for k, v in n_items.items())
>>> items
{'A': 1, 'B': 2, 'C': 3, 'D': 4, 'B_1': 4, 'E': 8, 'C_1': 4, 'C_1_1': 7, 'B_1_1': 9}
>>>
>>>
>>> # Merging an additional dictionary
...
>>> v_items = {"C": 25}
>>>
>>> items.update((max([k1 + "_1" for k1 in items if k1 == k or k1.startswith(k + "_1")], key=len, default=k), v) for k, v in v_items.items())
>>> items
{'A': 1, 'B': 2, 'C': 3, 'D': 4, 'B_1': 4, 'E': 8, 'C_1': 4, 'C_1_1': 7, 'B_1_1': 9, 'C_1_1_1': 25}
Run Code Online (Sandbox Code Playgroud)