我有一個嵌套串列(串列串列),如果嵌套串列中的 id 重復,我想合并:例如:
[
{'id': 2404, 'interfaces': [{'port': 78, 'module': 1 }]}
{'id': 2404, 'interfaces': [{'port': 79, 'module': 1 }]}
{'id': 1234, 'interfaces': [{'port': 79, 'module': 1 }]}
]
所以最終的解決方案應該是
[
{'id': 2404, 'interfaces': [{'port': 78, 'module': 1 },{'port': 79, 'module': 1 } ]}
{'id': 1234, 'interfaces': [{'port': 79, 'module': 1 }]}
]
uj5u.com熱心網友回復:
我將您的原始嵌套串列定義為unmerged變數。
該merged變數將包含輸出
unmerged =
[
{'id': 2404, 'interfaces': [{'port': 78, 'module': 1 }]},
{'id': 2404, 'interfaces': [{'port': 79, 'module': 1 }]},
{'id': 1234, 'interfaces': [{'port': 79, 'module': 1 }]},
]
merged = []
for unmerged_item in unmerged:
match = next((item for item in merged if item['id'] == unmerged_item['id']), None)
if match:
match['interfaces'].extend(unmerged_item['interfaces'])
else:
merged.append(unmerged_item)
代碼的輸出如下(merged):
[
{'id': 2404, 'interfaces': [{'port': 78, 'module': 1}, {'port': 79, 'module': 1}]},
{'id': 1234, 'interfaces': [{'port': 79, 'module': 1}]}
]
uj5u.com熱心網友回復:
使用字典來累積具有相同 id 的介面:
data = [
{'id': 2404, 'interfaces': [{'port': 78, 'module': 1 }]},
{'id': 2404, 'interfaces': [{'port': 79, 'module': 1 }]},
{'id': 1234, 'interfaces': [{'port': 79, 'module': 1 }]}
]
lookup = {}
for d in data:
iid = d["id"]
if iid not in lookup:
lookup[iid] = []
lookup[iid].extend(d["interfaces"])
res = [{ "id" : iid, "interfaces" : interfaces } for iid, interfaces in lookup.items()]
print(res)
輸出
[{'id': 2404, 'interfaces': [{'port': 78, 'module': 1}, {'port': 79, 'module': 1}]}, {'id': 1234, 'interfaces': [{'port': 79, 'module': 1}]}]
使用的替代解決方案collections.defaultdict:
from collections import defaultdict
lookup = defaultdict(list)
for d in data:
iid = d["id"]
lookup[iid].extend(d["interfaces"])
res = [{ "id" : iid, "interfaces" : interfaces } for iid, interfaces in lookup.items()]
特殊情況 (組是連續的)
如果且僅當字典 id 是連續的,您可以使用itertools.groupby,如下所示:
from itertools import groupby, chain
from operator import itemgetter
res = []
for iid, vs in groupby(data, key=itemgetter("id")):
interfaces = chain.from_iterable(v["interfaces"] for v in vs)
res.append({"id": iid, "interfaces" : list(interfaces) })
print(res)
輸出
[{'id': 2404, 'interfaces': [{'port': 78, 'module': 1}, {'port': 79, 'module': 1}]}, {'id': 1234, 'interfaces': [{'port': 79, 'module': 1}]}]
如果組不連續,您可以對資料進行排序,但這會使該方法的效率低于字典替代 O(n) 的效率(由于排序而為 O(nlogn))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/340905.html
上一篇:填充由兩個串列組成的元組
