我想比较字典中的元素,并根据一些比较标准删除项目.我希望它能有效率.我有一个功能可以做到这一点,但它反复复制字典.当然有一种更好的方式:
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}
Run Code Online (Sandbox Code Playgroud)
这种方法可以简化为:
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
Run Code Online (Sandbox Code Playgroud)
如果我们试试这个:
>>> 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}
Run Code Online (Sandbox Code Playgroud)
这用于itertools.combinations()生成所有可能的键组合(不重复).这样效率要高得多,因为你不需要在密钥相同的地方工作,并且在C语言中更有效率,而不是在Python方面.
请注意,在这里你正在修改mydict- 就在这个结尾,mydict是{111: 43}- 你需要复制dict并在函数中处理它,而不是直接在它上面,如果你不想要这种行为.这是最后一行中显示的内容.
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |