如何一次只从字典的一个元素中删除重复值?

How to remove the duplicates values from only one element of the dictionary at a time?

在给定的字典中 defaultdict(dict) 输入数据:

{726: {'X': [3.5, 3.5, 2.0}, 'Y': [2.0, 0.0, 0.0], 'chr': [2, 2, 2]}, 128: {'X': [0.5, 4.0, 4.0], 'Y': [4.0, 3.5, 3.5], 'chr': [3, 3, 3]}}

数值726128是键,是唯一的。其他元素是用 unique identifier 标记的值,也是唯一的。

我只想从 chr 中的 list values 中删除重复项,而不影响数据或值的顺序 在任何其他部分字典.

我怎样才能做到这一点?

谢谢,

您可以使用嵌套的字典理解并将列表转换为 set 以获得一组独特的项目。由于 chr 值中的所有项目都是相同的,因此集合将生成 1 个项目,因此在这种情况下顺序无关紧要。否则,您可以使用 OrderedDict.fromkeys() 通过保留顺序来获得一组独特的项目。

In [4]: {k: {k2: set(v2) if k2=='chr' else v2 for k2, v2 in v.items()} for k, v in d.items()}
Out[4]: 
{128: {'Y': [4.0, 3.5, 3.5], 'X': [0.5, 4.0, 4.0], 'chr': {3}},
 726: {'Y': [2.0, 0.0, 0.0], 'X': [3.5, 3.5, 2.0], 'chr': {2}}}

如果 d 是你的字典,你可以简单地做:

for k in d: d[k]['chr']=d[k]['chr'][0]

假定字符中的唯一值。

如果存在多个值,

for k in d: 
 l=d[k]['chr']+[None]
 d[k]['chr']=[x for (i,x) in enumerate(l[:-1]) if l[i]!=l[i+1]] 

会成功的。

您应该做的是遍历唯一键,并为每个唯一键选择 'chr' 键并将其值转换为一个集合(只能有唯一值)。

for lists in YOUR_DICT.values():
    lists['chr'] = list(set(lists['chr']))
print(YOUR_DICT)
# {'726': {'Y': [2.0, 0.0, 0.0], 'X': [3.5, 3.5, 2.0], 'chr': [2]}, 
#  '128': {'Y': [4.0, 3.5, 3.5], 'X': [0.5, 4.0, 4.0], 'chr': [3]}}

这将保留列表的顺序:

from collections import OrderedDict
a={726: {'X': [3.5, 3.5, 2.0], 'Y': [2.0, 0.0, 0.0], 'chr': [2, 3, 2, 1, 1, 2, 3 ]}, 128: {'X': [0.5, 4.0, 4.0], 'Y': [4.0, 3.5, 3.5], 'chr': [3, 3,3]}}
b=copy.deepcopy(a)
for key in b:
    a[key]['chr']=list(OrderedDict.fromkeys(b[key]['chr'])) 

在创建a的那一刻,a中顶级键的原始顺序将丢失。如果你想让 a 首先有 726,你需要从一开始就将它创建为 OrderedDict。