删除嵌套字典中的重复值

时间:2020-06-18 05:06:22

标签: python list dictionary

我有一个嵌套字典d1

d1={'Hiraki': {'Hiraki_2': ['KANG_785','KANG_785','KANG_762']}, 'LakeTaupo': {'LakeTaupo_2': ['KANG_785', 'KANG_785', 'KANG_785', 'KANG_751']}}

我想删除每个键的重复值。删除重复值后的结果应为:

d1={'Hiraki': {'Hiraki_2': ['KANG_785','KANG_762']}, 'LakeTaupo': {'LakeTaupo_2': ['KANG_785', 'KANG_751']}}

我不怎么用python编码。请帮助我。

5 个答案:

答案 0 :(得分:2)

您可以使用此答案中所述的相同策略:

Convert a mixed nested dictionary into a list

但是对于isinstance(d, list),返回list(set(d))(将删除重复的条目)而不是d

例如:

def dedupe_lists(d: dict) -> dict:
    if isinstance(d, list):
        return list(set(d))
    if isinstance(d, dict):
        return {k: dedupe_lists(v) for k, v in d.items()}
    return d

答案 1 :(得分:1)

您可以尝试:

d1={'Hiraki': {'Hiraki_2': ['KANG_785','KANG_785','KANG_762']}, 'LakeTaupo': {'LakeTaupo_2': ['KANG_785', 'KANG_785', 'KANG_785', 'KANG_751']}}

output = {}
for key, val in d1.items():
    for key1, val1 in val.items():
        output[key] = {
            key1: list(set(val1))
        }
print(output)

输出:

{'Hiraki': {'Hiraki_2': ['KANG_785', 'KANG_762']}, 'LakeTaupo': {'LakeTaupo_2': ['KANG_785', 'KANG_751']}}

答案 2 :(得分:1)

基本上,如果要删除sequence中的重复值,请将其转换为set,然后再次返回。

>>> data = ['KANG_785','KANG_785','KANG_762']
>>> data = list(set(data))
>>> data
['KANG_762', 'KANG_785']

请注意,这将不会保持顺序。

另外,请仔细考虑您是否确实需要listset毕竟仍然是可迭代的,因此,如果您想始终保持唯一性,可以考虑将数据存储为set并仅在必要时转换为list

>>> data = ['KANG_785','KANG_785','KANG_762']
>>> data = set(data)
>>> data
{'KANG_762', 'KANG_785'}
>>> for i in data:
...     print(i)
...     
KANG_762
KANG_785
>>> type(data)
<class 'set'>

答案 3 :(得分:1)

您可以使用set()消除重复项。

d1={'Hiraki': {'Hiraki_2': ['KANG_785','KANG_785','KANG_762']}, 'LakeTaupo': {'LakeTaupo_2': ['KANG_785', 'KANG_785', 'KANG_785', 'KANG_751']}}

d2 ={key1: {key2: list(set(val2)) for key2, val2 in val1.items()} for key1, val1 in 
d1.items()}

print(d2)

输出:

{'Hiraki': {'Hiraki_2': ['KANG_785', 'KANG_762']}, 'LakeTaupo': {'LakeTaupo_2': ['KANG_785', 'KANG_751']}}

答案 4 :(得分:1)

这是一个递归解决方案:

这将在原位置更改列表

d1={'Hiraki': {'Hiraki_2': ['KANG_785','KANG_785','KANG_762']}, 'LakeTaupo': {'LakeTaupo_2': ['KANG_785', 'KANG_785', 'KANG_785', 'KANG_751']}}

# Deals with the tuples
def recurse_tuple(my_tup):
    for i, v in enumerate(my_tup):
        if isinstance(v, dict): my_tup[i] = recurse_dict(v)
    return my_tup

# Deals with the dictionaries and lists
def recurse_dict(my_dict):
    for k, v in my_dict.items():
        if isinstance(v, dict): my_dict[k] = recurse_dict(v)
        if isinstance(v, tuple): my_dict[k] = recurse_tuple(v)
        if isinstance(v, list): my_dict[k] = set(v)
    return my_dict

print(recurse_dict(d1))

#Output
{'Hiraki': {'Hiraki_2': {'KANG_762', 'KANG_785'}}, 'LakeTaupo': {'LakeTaupo_2': {'KANG_785', 'KANG_751'}}}

注意:@Samwise凭借出色的递归功能击败了我。