Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将dict与自身进行比较,并有效地删除类似的键_Python - Fatal编程技术网

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

Python 将dict与自身进行比较,并有效地删除类似的键,python,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()

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

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}
mydict={1:5,2:7,3:9,4:9,7:7,8:0111:43110:77}
def部分复制销毁程序(mydict,公差):
对于mydict.keys()中的key1:
mydict_copy=mydict.copy()
对于mydict_copy.keys()中的键2:
如果key2-公差
这种方法可以简化为:

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
这用于生成所有可能的键组合(无需重复)。这样做效率更高,因为您不必在密钥相同的地方工作,而且在C中比在Python中工作效率更高


请注意,这里您正在原地修改
mydict
——也就是在本文末尾,
mydict
{111:43}
——如果不希望出现这种行为,您需要复制dict并在函数中对其进行处理,而不是直接对其进行处理。这是最后一行显示的内容。

如果有一对钥匙在彼此的公差范围内,删除哪一个重要吗?@David Robinson-不重要,但在上面的示例中,当公差=2时,1,2,3,4中只应保留一个钥匙。这看起来很棒,您的第一个版本的
product
看起来也不错。@fraxel产品起作用了,但这意味着您必须手动过滤重复的结果和键相同的结果。使用组合会更快,不会产生你不需要的结果,减少你需要做的检查-双赢。这将抛出一个
keyrorm
,即使是像
mydict={1.5:None,1:None,2:None}
和公差
0.75
这样的简单示例。(该示例依赖于实现,但这适用于pypy和CPython)。jorgeca:啊,当从我的置换版本中删除检查时,我过于热心了,我已经解决了这个问题。好的地方。顺便说一下,这个例子表明这个问题没有一个定义良好的解决方案。答案应该是
{1:None}
还是
{1.5:None,2:None}
?)
>>> 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}