如何一次只从字典的一个元素中删除重复值?
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]}}
数值726
和128
是键,是唯一的。其他元素是用 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。
在给定的字典中 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]}}
数值726
和128
是键,是唯一的。其他元素是用 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。