Python:如果值存在于dict中较长的键中,则从字典值列表中删除该值

Python:如果值存在于dict中较长的键中,则从字典值列表中删除该值,python,Python,我有这样一句话: {'key1':['val1','val2','val3'], 'key1_key2':['val1','val3','val4']} 我想删除冗余,对于每个值,如果该值也是具有较长单词的不同键的值,请从较短单词键中删除该值 因此,在本例中,输出为: {'key1':['val2'],'key1_key2':['val1','val3','val4']} 我正在寻找最具蟒蛇风格的方法。我知道我可以发展的一个方法是: #for each key and value in th

我有这样一句话:

{'key1':['val1','val2','val3'], 'key1_key2':['val1','val3','val4']}
我想删除冗余,对于每个值,如果该值也是具有较长单词的不同键的值,请从较短单词键中删除该值

因此,在本例中,输出为:

{'key1':['val2'],'key1_key2':['val1','val3','val4']}
我正在寻找最具蟒蛇风格的方法。我知道我可以发展的一个方法是:

#for each key and value in the dict
for k,v in dict1.items():
        #so i can compare to every other key and value in the dict
        for k2,v2 in dict1.items():
                #if k2 string is a subset of k string (i.e. if one k is 'key1' and one k is 'key1_key2'):
                        small_list = #remove any item that's also in the big list
                        dict1[k] = small_list

我想知道这是开发这个的最好方法(在我被拖下水试图让它工作之前),还是有人有更好的解决方案

您可以执行以下操作:

from collections import defaultdict

d = {'key1': ['val1', 'val2', 'val3'], 'key1_key2': ['val1', 'val3', 'val4']}

longest_key = defaultdict(str)

# create a dictionary that maps values to the longest key
for key, values in d.items():
    for value in values:
        longest_key[value] = max(longest_key[value], key, key=len)

# filter out the input dictionary using the lookup dictionary created in the above step
for key, values in d.items():
    d[key] = [value for value in values if longest_key[value] == key]

print(d)
输出

{'key1': ['val2'], 'key1_key2': ['val1', 'val3', 'val4']}

这句话的结果应该是什么?@RomanPerekhrest我相信输出应该是
{'key1'['val1','val2','val3','val4'],'key3'.'key2'.'key1'.['val1'].['val1'].[/code>?@RomanPerekhrest我相信输出应该是
{'key1'['val2'],'key1'.['val2'],'key2'.['val3','val4'],'key2'.['key1'.]。这个
{'key1':['val1','val2','val3'],'key1_-key2':['val1','val3','val4','val2'],'key3_-key1_-key2':['val1']怎么样
?(钥匙换了)@RomanPerekhrest你说钥匙换了是什么意思?如果只将值保留在最长键中(最长按len)。@RaySteam,比较我的第一条和最后一条评论中的输入dict,看看区别。我不是“为了好玩”才发表我的评论——我们需要知道边缘案例