将dict与自身进行比较并有效地删除类似的键

时间:2012-04-18 18:25:08

标签: python

我想将字典中的元素相互比较,并根据某些比较条件删除项目。我希望它能有效率。我有一个功能可以做到这一点,但它反复复制字典。当然有一种更好的方式:

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}

1 个答案:

答案 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并在函数中处理它如果你不想要这种行为,而不是直接在它上面。这是最后一行中显示的内容。