如果字典键的值相交,则组合字典的值(保存为列表)

时间:2019-07-18 14:16:17

标签: python-3.x

我有一本大字典,但在这里我会简单地讲。字典看起来像这样:

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表示。

2 个答案:

答案 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']}