我有一本大字典,但在这里我会简单地讲。字典看起来像这样:
d = {'key1': ['val1, val2, val3'],
'key2': ['val4, val5, val6'],
'key3': ['val7','val8','val3']}
我需要字典像这样:
{'key1': ['val1, val2, val3', 'val7', 'val8'],
'key2': ['val4, val5, val6']}
由于key1和key3相交,我想将它们组合成一个键(哪个键无关紧要)
更新: 问题是这样的,我有两个单独的字典,它们具有如图所示的键和值。我试图根据它们之间的交集将它们组合在一起。 我用了这个:
d3= {}
for k1,v1 in d2.items():
found_in_other_dict = False
for k2,v2 in d1.items():
if (k1 in v2) or (k1 == k2) or (k2 in v1) or (len(set(v1).intersection(set(v2))) > 0):
d3.update({
k1: list(set(v1+ v2 + [k1,k2]))
})
found_in_other_dict = True
else:
if k2 not in d3 and k2 not in [item for sublist in list(d3.values()) for item in sublist]:
d3.update({
k2:list(set(v2 + [k2]))
})
if(not found_in_other_dict):
if k1 not in d3 and k1 not in [item for sublist in list(d3.values()) for item in sublist]:
d3.update({
k1:list(set(v1 + [k1]))
})
在此之后,我在这篇文章中问了这个问题。 为什么他们不首先合并? 假设我们有以下内容:
d1 = {'key1': ['val1','val2',
'key2': ['val3','val4'}
d2 = {'key1': ['val3,'val6'}
代码运行时,它将分别处理d1中的key1。然后它将d1中的k2与d2中的k1合并。 这就是为什么我有d3字典,在这个问题的开头用d表示。
答案 0 :(得分:0)
d = {'key1': ['val1', 'val2', 'val3'],
'key2': ['val4', 'val5', 'val6'],
'key3': ['val7', 'val8', 'val3']} # this is your input
# compute the keys associated with each value in each of the value-lists
prep = {}
for k,vals in d.items():
for val in vals:
prep.setdefault(val, []).append(k)
for k in prep: prep[k].sort()
# this is the structure you want to return
answer = {}
for k, vals in d.items():
answer.setdefault(k,[])
s = set()
for val in vals:
for key in prep[val]:
s = s.union(d[key])
answer[k] = sorted(s) # make sure the values are properly sorted, so that they can be compared properly
# delete the repeated entries
inverse = {} # track which values are repeated across keys
for k,vals in answer.items():
inverse.setdefault(tuple(vals), []).append(k)
for vals in inverse.values():
for v in vals[1:]: answer.pop(v)
输出:
In [57]: answer
Out[57]:
{'key1': ['val1', 'val2', 'val3', 'val7', 'val8'],
'key2': ['val4', 'val5', 'val6']}
答案 1 :(得分:0)
一种可能的解决方案,我不想把它扔掉,所以就把它留在这里:
d = {'key1': ['val1', 'val2', 'val3'],
'key2': ['val4', 'val5', 'val6'],
'key3': ['val7','val8','val3']}
out = {}
while d:
ik, iv = d.popitem()
for k, v in out.items():
intersection = k[1].intersection(iv)
if intersection:
v.extend(intersection)
break
else:
out[(ik, frozenset(iv))] = iv
out = {k[0]: v for k, v in out.items()}
from pprint import pprint
pprint(out, width=60)
打印:
{'key2': ['val4', 'val5', 'val6'],
'key3': ['val7', 'val8', 'val3', 'val3']}