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

Python 如何一次只从字典的一个元素中删除重复的值?,python,list,dictionary,duplicates,defaultdict,Python,List,Dictionary,Duplicates,Defaultdict,在此给定词典中,默认dict(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是键,并且是唯一的。其他元素是用唯一标识符标记的值,也是唯一的 我只想从chr中的列表值中删除重复项,而不影响字典任何其他部分中值的数据或顺序 我如何

在此给定词典中,默认dict(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
是键,并且是唯一的。其他元素是用
唯一标识符标记的值,也是唯一的

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

我如何才能做到这一点


谢谢,

您可以使用嵌套的dict理解并将列表转换为
集合
,以获得唯一的项目集合。由于
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}}}

您可以使用嵌套的dict理解并将列表转换为
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]
假设chr中的值是唯一的

如果存在多个值

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]] 

将完成这项工作。

如果
d
是您的字典,您只需执行以下操作:

for k in d: d[k]['chr']=d[k]['chr'][0]
假设chr中的值是唯一的

如果存在多个值

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”键,并将其值转换为一个集合(该集合只能具有唯一值)


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


这将保留列表的顺序:

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中顶级关键点的原始顺序将丢失。如果您想先创建726,则需要从一开始就将其创建为OrderedICT。

这将保留列表的顺序:

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中顶级关键点的原始顺序将丢失。如果你想让一个726先有一个,你需要从一开始就按照OrderedDict创建它。

那么你想要
'chr':3
'chr':[3]
chr
的所有元素是相同的还是可能有其他值?您尝试了什么?@TemporalWolf:我认为
的“chr”:“2”很好。但是,当我在给定的dict:
中对k进行
时,它会对下游分析产生任何影响吗。而且,
chr
中的值是唯一的。但是,如果存在重复项,您是否可以提出一个解决方案,将其减少为唯一值。仅就我所知。你关心
chr
中内容的顺序吗?e、 g.如果您有
'chr':[2,2,1,1,3,3]
您想要
[2,1,3]
?或者任何订单都可以吗?订单需要严格保存。所以,
[2,1,3]
。谢谢你想要
'chr':3
'chr':[3]
chr
的所有元素是相同的还是可能有其他值?您尝试了什么?@TemporalWolf:我认为
的“chr”:“2”很好。但是,当我在给定的dict:
中对k进行
时,它会对下游分析产生任何影响吗。而且,
chr
中的值是唯一的。但是,如果存在重复项,您是否可以提出一个解决方案,将其减少为唯一值。仅就我所知。你关心
chr
中内容的顺序吗?e、 g.如果您有
'chr':[2,2,1,1,3,3]
您想要
[2,1,3]
?或者任何订单都可以吗?订单需要严格保存。所以,
[2,1,3]
。谢谢你给我添加一些解释,这样我可以在工作中更加独立。不过非常感谢!很抱歉,由于某些原因,此方法无法正常工作。我得到的是嵌套字典,如
{2}
,而不是
'2'
或'[2]
。我希望在给定的目录中为k运行
时不会产生任何问题:…`。不过非常感谢@everestal007
{2}
不是字典,它是一个集合,集合是iterable对象,也就是说可以使用for循环对其进行迭代。但是,如果你想让对象
2
不在任何iterable中,你可能应该使用一个简单的循环,而不是理解,并手动处理所有情况。@nir0s是的。事实上,这就是抽象的问题,(如果你这样想的话;)@Kasramvd-oh显然。我无意暗示这是可以避免的。我刚到了一个地步,我正在写一些复杂的听写理解,而自己却看不懂:)你能补充一些解释吗,这样我在工作中可以更加独立。不过非常感谢!很抱歉,由于某些原因,此方法无法正常工作。我得到的是嵌套字典,如
{2}
,而不是
'2'
或'[2]
。我希望在给定的目录中为k运行
时不会产生任何问题:…`。不过非常感谢@everestal007
{2}
不是字典,它是一个集合,集合是iterable对象,也就是说可以使用for循环对其进行迭代。但是,如果你想让对象
2
不在任何iterable中,你可能应该使用一个简单的循环,而不是理解,并手动处理所有情况。@nir0s是的。事实上,这就是抽象的问题,(如果你这样想的话;)@Kasramvd-oh显然。我无意暗示这是可以避免的。我刚到了一个地步,当时我正在写一些复杂的听写理解,而自己却看不懂:)