<p><strong>功能:</strong></p>
<pre><code>def group_dicts_from_list(lst, group_by, merge_rules, result):
if not lst or not isinstance(lst, list) or not group_by or not merge_rules or \
not isinstance(merge_rules, dict) or not isinstance(result, dict):
return
if "aggregate" not in result:
result["aggregate"] = []
for item in lst:
if isinstance(item, dict):
if group_by in item:
for res in result["aggregate"]:
if res[group_by] == item[group_by]:
tmp = res
break
else:
tmp = {group_by: item[group_by]}
result["aggregate"].append(tmp)
for src, dst in merge_rules.items():
if src in item:
if dst not in tmp:
tmp[dst] = []
src_tmp = {src: item[src]}
if src_tmp not in tmp[dst]:
tmp[dst].append(src_tmp)
elif isinstance(item, list):
group_dicts_from_list(item, group_by, merge_rules, result) # !!! recursion !!!
</code></pre>
<p><strong>用法:</strong></p>
<pre><code>field_to_be_check = "state"
my_merge_rules = {
"city": "cities",
"haps": "my_haps",
}
data = [
[{'haps': 'hap0', 'state': 'tamil nadu', 'ads': 'ad1', 'city': 'tenkasi'},
{'haps': 'hap0', 'state': 'tamil nadu', 'ads': 'ad4', 'city': 'nagerkoil'},
{'haps': 'hap0', 'state': 'tamil nadu', 'ads': 'ad1', 'city': 'tuticorin'},
{'haps': 'hap1', 'state': 'kerala', 'ads': 'ad2', 'city': 'kolikodu'},
{'haps': 'hap1', 'state': 'kerala', 'ads': 'ad2', 'city': 'kottayam'},
{'haps': 'hap1', 'state': 'kerala', 'ads': 'ad2', 'city': 'idukki'},
{'haps': 'hap2', 'state': 'mumbai', 'ads': 'ad3', 'city': 'Akola'},
{'haps': 'hap2', 'state': 'mumbai', 'ads': 'ad3', 'city': 'Washim'},
{'haps': 'hap2', 'state': 'mumbai', 'ads': 'ad3', 'city': 'Jalna'},
{'haps': 'hap2', 'state': 'mumbai', 'ads': 'ad3', 'city': 'Latur'}],
[{'haps': 'hap1', 'state': 'tamil nadu', 'ads': 'ad1', 'city': 'madurai'},
{'haps': 'hap0', 'state': 'tamil nadu', 'ads': 'ad1', 'city': 'chennai'},
{'haps': 'hap1', 'state': 'kerala', 'ads': 'ad2', 'city': 'palakad'},
{'haps': 'hap1', 'state': 'kerala', 'ads': 'ad2', 'city': 'guruvayor'},
{'haps': 'hap2', 'state': 'mumbai', 'ads': 'ad3', 'city': 'Nanded'},
]
]
result = {}
group_dicts_from_list(data, field_to_be_check, my_merge_rules, result)
print(result)
</code></pre>
<p><strong>输出:</strong></p>
<pre><code>{'aggregate': [{'state': 'tamil nadu', 'cities': [{'city': 'tenkasi'}, {'city': 'nagerkoil'}, {'city': 'tuticorin'}, {'city': 'madurai'}, {'city': 'chennai'}], 'my_haps': [{'haps': 'hap0'}, {'haps': 'hap1'}]}, {'state': 'kerala', 'cities': [{'city': 'kolikodu'}, {'city': 'kottayam'}, {'city': 'idukki'}, {'city': 'palakad'}, {'city': 'guruvayor'}], 'my_haps': [{'haps': 'hap1'}]}, {'state': 'mumbai', 'cities': [{'city': 'Akola'}, {'city': 'Washim'}, {'city': 'Jalna'}, {'city': 'Latur'}, {'city': 'Nanded'}], 'my_haps': [{'haps': 'hap2'}]}]}
</code></pre>
<p><strong>评论:</strong></p>
<p>我已经换了</p>
<pre><code>merger = ["city", "haps"]
merge_name = ["cities", "my_haps"]
</code></pre>
<p>与</p>
<pre><code>my_merge_rules = {
"city": "cities",
"haps": "my_haps",
}
</code></pre>
<p>因为我发现它更可靠<em>(它可以防止列表长度不同的情况)</em>。你知道吗</p>