使重复值在OrderedDict中唯一

时间:2019-01-23 12:00:24

标签: python python-3.x dictionary ordereddictionary

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

现在下面提到的代码在python2上很好用,因为有序字典可以被突变,而在python3上则不能,所以我制作了有序字典的副本并将其与原始有序字典进行比较

zoo:::subset.zoo

为澄清起见,我只想删除类型为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) 的重复项,即包含一项的列表。

1 个答案:

答案 0 :(得分:2)

假设您希望删除具有单个列表项的重复项,则可以改编itertools unique_eveseen recipe。想法是维护set个项目中的一个frozenset,并且只有在遇到包含一个项目的列表时才添加到其中。

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