Ast*_*rea 3 python dictionary python-2.7
我试图dict
在Python中合并两个s,可能是相同的,或者可以有更少的信息
恩.
master = {"a": 5564, "c": [{"d2":6}]}
daily = { "a": 795, "b": 1337, "c": [{"d1": 2,"d2": 2,"d3": [{"e1": 4,"e2": 4}]}]}
Run Code Online (Sandbox Code Playgroud)
它们需要合并,因此输出就是这样
master = { "a": 6359, "b": 1337, "c": [{"d1": 2,"d2": 8,"d3": [{"e1": 4,"e2": 4}]}]}
Run Code Online (Sandbox Code Playgroud)
虽然我只得到了返回null,但我还是试了一下.我可能会遗漏某些东西或者只是离开.我只是想不通.任何帮助都会很棒谢谢.
def merge(master,daily):
for k, v in daily.items():
if isinstance(daily[k],list):
key_check = keyCheck(k, master)
if key_check:
merge(master[k],daily[k])
else :
master[k] = daily[k]
else :
if keyCheck(k, master):
master[k] += daily[k]
else :
master[k] = daily[k]
Run Code Online (Sandbox Code Playgroud)
keyCheck
只检查一个键是否在字典中,这样就不会抛出错误.
这是一个线性使用collections.Counter()
:
>>> from collections import Counter
>> C2 = Counter(daily)
>>> C1 = Counter(master)
>>>
>>> {k:reduce(lambda x,y : Counter(x)+Counter(y), v) if isinstance(v, list) and k in (C1.viewkeys() & C2) else v for k, v in (C1 + C2).items()}
{'a': 6359, 'c': Counter({'d3': [{'e1': 4, 'e2': 4}], 'd2': 8, 'd1': 2}), 'b': 1337}
Run Code Online (Sandbox Code Playgroud)
首先,你可以将你的词典转换为Counter对象,以便在对计数器求和之后添加公共键的值(这就是Counter的add属性的工作方式),然后你可以遍历项目和两个计数器中存在的键和它们的键值是列表,您可以使用该reduce()
函数将相同的算法应用于所有列表项.
如果列表包含另一个嵌套的类似数据结构,则可以将此代码转换为递归函数.
归档时间: |
|
查看次数: |
70 次 |
最近记录: |