我有一個包含任意鍵名和值的字典,這些鍵名和值是與這些鍵中的節點相對應的串列:
{'foo': ["1", "2", "7"], 'bar': ["4", "8", "7"], 'baz': ["5", "6"]}
我需要合并這本字典,以便如果串列中的任何專案在另一個串列中,則這兩個串列合并為一個鍵:
期望輸出:
{'foo': ["1", "2", "4", "7", "7", "8"], 'baz': ["5", "6"]}
我目前有以下代碼,但按照字典的規模,運行時間太長了:
def consolidate(orig_dict):
consolidated = {}
removed = set()
for key, val in orig_dict.items():
if key in removed:
continue
consolidated.setdefault(key, val)
for item in val:
for key2, val2 in orig_dict.items():
if key == key2:
continue
if key2 in removed:
continue
if item in val2:
val.extend(val2)
removed.add(key)
removed.add(key2)
return consolidated
我特別在尋找任何減少時間復雜性的方法,并且愿意接受建議。
uj5u.com熱心網友回復:
您的嵌套回圈將再次遍歷所有鍵。您不需要再次檢查前面的鍵,因此您應該跟蹤鍵位置(帶enumerate)并且只檢查以下元素。此外,您還可以進行設定val以提高會員測驗的速度:
def consolidate(orig_dict):
consolidated = dict()
removed = set()
for i, (key, val) in enumerate(orig_dict.items()):
if key in removed:
continue
consolidated.setdefault(key, val)
val_set = set(val)
for key2, val2 in [(k,v) for k,v in list(orig_dict.items())[i 1:] if k not in removed]:
if any(item in val_set for item in val2):
consolidated[key] = val2
removed.add(key2)
return consolidated
uj5u.com熱心網友回復:
您可以使用集合和集合交集來加速操作。
a = {'foo': ["1", "2", "7"], 'bar': ["4", "8", "7"], 'baz': ["5", "6"]}
consolidated = {}
joined_keys = set()
for k1, v1 in a.items():
if k1 in joined_keys:
continue
joined_keys.add(k1)
set_v1 = set(v1)
for k2, v2 in a.items():
if k2 not in joined_keys and set(v2) & set_v1:
v1.extend(v2)
joined_keys.add(k2)
consolidated[k1]=v1
print(consolidated)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/373965.html
上一篇:用最大值更新字典鍵
下一篇:Python:生成嵌套字典
