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()して、可能なすべてのキーの組み合わせを (繰り返しなしで) 生成します。これは、キーが同じ場所で作業する必要がないため、はるかに効率的であり、Python を使用するよりも C で効率的に実行できます。

ここでmydictは、その場で変更していることに注意してください-つまり、これの最後にありmydictます{111: 43}-この動作が必要ない場合は、dictをコピーして、直接ではなく、関数で作業する必要があります。これが最後の行に示されているものです。

于 2012-04-18T18:39:01.347 に答える