我有一个嵌套字典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编码。请帮助我。
答案 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']
请注意,这将不会保持顺序。
另外,请仔细考虑您是否确实需要list
; set
毕竟仍然是可迭代的,因此,如果您想始终保持唯一性,可以考虑将数据存储为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凭借出色的递归功能击败了我。