【问题标题】:How to remove the duplicates values from only one element of the dictionary at a time?如何一次只从字典的一个元素中删除重复值?
【发布时间】:2017-08-05 05:37:37
【问题描述】:

在这个给定的字典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 中删除重复项而不影响字典任何其他部分中值的数据或顺序

我怎样才能做到这一点?

谢谢,

【问题讨论】:

  • 所以你想要'chr': 3'chr': [3]chr 的所有元素是相同的还是可能有其他值?
  • 你尝试了什么?
  • @TemporalWolf:我认为'chr': '2' 很好。但是,当我做for k in given_dict: 时,它会对下游分析产生任何影响吗?此外,chr 中的值是唯一的。但是,您能否提出一个解决方案,如果存在重复项,该解决方案可能有助于将其减少为唯一值。仅据我所知。
  • 你关心chr中的内容的顺序吗?例如如果你有'chr': [2, 2, 1, 1, 3, 3],你想要[2, 1, 3]吗?或者任何订单都可以?
  • 订单需要严格保存。所以,[2, 1, 3]。谢谢

标签: python list dictionary duplicates defaultdict


【解决方案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]] 

会成功的。

【讨论】:

    【解决方案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}}}
    

    【讨论】:

    • 您能否添加一些解释,以便我在完成工作时更加独立。非常感谢!
    • 对不起,但由于某种原因,这种方法不能正常工作。我正在获取嵌套字典,例如 {2} 而不是 '2' 或 '[2]. I hope its not going to create any problem while running for k in given_dict: ...`。非常感谢!
    • @everestial007 {2} 不是字典,它是一个集合,集合是可迭代的对象,也就是说您可以使用 for 循环对其进行迭代。但是,如果您希望对象 2 不在任何可迭代中,您可能应该使用简单的循环而不是理解并手动处理所有情况。
    • @nir0s 是的。实际上这就是抽象的问题,(如果你用这种方式来简化它;))
    • @Kasramvd 哦,很明显。我无意暗示这是可以避免的。我刚到了要写一些复杂的dict理解的地步,我自己看不懂:)
    【解决方案3】:

    您应该做的是遍历唯一键,并为每个唯一键选择“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]}}
    

    【讨论】:

      【解决方案4】:

      这将保留列表的顺序:

      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 时丢失。如果您想先拥有 726,则需要从头开始将其创建为 OrderedDict。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-16
        • 1970-01-01
        • 2020-08-27
        • 2014-06-29
        • 2020-02-10
        • 2022-07-10
        • 2021-11-18
        • 2021-04-09
        相关资源
        最近更新 更多