web-dev-qa-db-ja.com

私のコードのkeyerror 1

辞書入力を受け取り、その辞書で一意の値を持つキーのリストを返す関数を書いています。考えて、

ip = {1: 1, 2: 1, 3: 3}

したがって、キー3にはdictには存在しない一意の値があるため、出力は[3]になります。

与えられた機能に問題があります:

def uniqueValues(aDict):

    dicta = aDict
    dum = 0
    for key in aDict.keys():

        for key1 in aDict.keys():

            if key == key1:
                dum = 0
            else:
                if aDict[key] == aDict[key1]:
                    if key in dicta:
                        dicta.pop(key)
                    if key1 in dicta:
                        dicta.pop(key1)

    listop = dicta.keys()
    print listop
    return listop

次のようなエラーが発生します。

ファイル「main.py」の14行目、aDict [key] == aDict [key1]の場合のuniqueValues内:KeyError:1

どこで間違っているのですか?

6

あなたの主な問題はこの行です:

dicta = aDict

辞書のコピーを作成していると思いますが、実際には辞書が1つしかないため、dictaの操作によってaDictも変更されます(そのため、adictから値を削除すると、aDictからも値が削除され、 KeyError)。

1つの解決策は

dicta = aDict.copy()

(また、自分が何をしているのかをより明確にするために、変数にわかりやすい名前を付ける必要があります)

(編集)また、あなたがやっていることをより簡単に行う方法:

def iter_unique_keys(d):
    values = list(d.values())
    for key, value in d.iteritems():
        if values.count(value) == 1:
            yield key

print list(iter_unique_keys({1: 1, 2: 1, 3: 3}))
3
Emile

使用するCountercollectionsライブラリから:

from collections import Counter

ip = {
    1: 1,
    2: 1,
    3: 3,
    4: 5,
    5: 1,
    6: 1,
    7: 9
}

# Generate a dict with the amount of occurrences of each value in 'ip' dict
count = Counter([x for x in ip.values()])

# For each item (key,value) in ip dict, we check if the amount of occurrences of its value.
# We add it to the 'results' list only if the amount of occurrences equals to 1. 
results = [x for x,y in ip.items() if count[y] == 1]

# Finally, print the results list
print results

出力:

[3, 4, 7]