9

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

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}
4

1 回答 1

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 并在函数中处理它,而不是直接处理它。这就是最后一行中显示的内容。

于 2012-04-18T18:39:01.347 回答