我想将字典中的元素相互比较,并根据某些比较条件删除项目。我希望它能有效率。我有一个功能可以做到这一点,但它反复复制字典。当然有一种更好的方式:
mydict = {1:5,2:7,3:9,4:9,7:7,8:0,111:43,110:77}
def partial_duplicate_destroyer(mydict,tolerance):
for key1 in mydict.keys():
mydict_copy = mydict.copy()
for key2 in mydict_copy.keys():
if key2 - tolerance < key1 < key2 + tolerance and not(key1 == key2):
del(mydict[key1])
break
return mydict
print partial_duplicate_destroyer(mydict,2)
print partial_duplicate_destroyer(mydict,20)
print partial_duplicate_destroyer(mydict,200)
#correct output:
# {4: 9, 8: 0, 111: 43}
# {8: 0, 111: 43}
# {111: 43}
答案 0 :(得分:6)
这种方法可以简化为:
from itertools import combinations
def partial_duplicate_destroyer(mydict, tolerance):
#Modifies in-place. Returns only as a convenience. Copy if you don't want this behaviour.
for key1, key2 in combinations(mydict, 2):
if key1 in mydict and key2 - tolerance < key1 < key2 + tolerance:
del mydict[key1]
return mydict
如果我们试试这个:
>>> mydict = {1:5,2:7,3:9,4:9,7:7,8:0,111:43,110:77}
>>> partial_duplicate_destroyer(mydict, 2)
{4: 9, 8: 0, 111: 43}
>>> partial_duplicate_destroyer(mydict, 20)
{8: 0, 111: 43}
>>> partial_duplicate_destroyer(mydict, 200)
{111: 43}
>>> mydict
{111: 43}
这使用itertools.combinations()
生成所有可能的键组合(不重复)。这样做效率要高得多,因为你不必在键盘相同的情况下工作,而且它在C语言中的效率更高,而不是在Python方面。
请注意,您现在正在修改mydict
- 在此结束时,mydict
为{111: 43}
- 您需要复制dict并在函数中处理它如果你不想要这种行为,而不是直接在它上面。这是最后一行中显示的内容。