【问题标题】:Making duplicate values unique in OrderedDict在 OrderedDict 中使重复值唯一
【发布时间】:2019-06-17 00:24:43
【问题描述】:

有一个有序的字典,它有重复的键值对。想要使那些重复的值唯一。 例如。 4244158 & 4244159 组合存在两次 我想保留其中一个。

现在下面提到的代码在 python2 上很好,因为有序 dict 可以变异,但在 python3 中不能,所以我复制了有序 dict 并将其与原始有序 dict 进行比较

ordered_parkstop_dict = OrderedDict([('4244162', []),
                                     ('4244158', ['4244159']), 
                                     ('4244159', ['4244158']), 
                                     ('4244157', ['4244160', '4244161']),
                                     ('4244160', ['4244157', '4244161']),        
                                     ('4244161', ['4244157', '4244160'])])
new_ordered_parkstop_dict = ordered_parkstop_dict.copy()
for key, value in ordered_parkstop_dict.items():
    for k,v in ordered_parkstop_dict.items():
        klist = []
        keylist = []
        if value and v:
            if len(v)==1 and len(value)==1:
                klist.append(k), keylist.append(key)
            if (keylist == v) and (klist == value and len(value) == 1):
                new_ordered_parkstop_dict.pop(key)

为了澄清,我只想删除 x -> [y], y -> [x] 类型的重复项,即包含一项的列表。

【问题讨论】:

  • 你能准确定义哪些组合被认为是重复的吗?您是否只想删除 x -> [y], y -> [x] 类型的重复项,即包含一项的列表?
  • @jpp 是的,我只想从 new_ordered_pa​​rkstop_dict 中删除类型 x -> [y], y -> [x]

标签: python python-3.x dictionary ordereddictionary


【解决方案1】:

假设您希望删除具有单个列表项的重复项,您可以调整itertools unique_eveseen recipe。这个想法是维护setfrozenset 项目,并且仅当您遇到包含一个项目的列表时才添加到它。

from collections import OrderedDict

def unique_everseen(iterable):
    seen = set()
    seen_add = seen.add
    for key, value in iterable:
        if len(value) != 1:
            yield key, value
        else:
            if frozenset((value[0], key)) not in seen:
                seen_add(frozenset((value[0], key)))
                yield key, value

res = OrderedDict(unique_everseen(dd_input.items()))

在 Python3 中,您应该在任何情况下在添加/删除项目时迭代诸如 dict.items 之类的视图。

结果:

print(res)

OrderedDict([('4244162', []),
             ('4244158', ['4244159']),
             ('4244157', ['4244160', '4244161']),
             ('4244160', ['4244157', '4244161']),
             ('4244161', ['4244157', '4244160'])])

【讨论】:

  • 感谢您的帮助。正是我想要的。已经想出了一个解决方案,但你的看起来更干净
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 2021-12-23
相关资源
最近更新 更多