有一个有序的字典,它有重复的键,值配对。想要使这些重复值唯一。例如。 4244158和4244159组合存在两次我想保留其中一个。
现在下面提到的代码与python2一样好,因为有序的dict可以变异而不是python3所以我制作了有序字典的副本并将其与原始有序字典进行比较
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]
类型的副本,即包含一个项目的列表。
假设您希望删除具有单个列表项的重复项,则可以调整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'])])