rajesh padgilwar
rajesh padgilwar

Reputation: 127

keyerror 1 in my code

I am writing a function that take dictionary input and return list of keys which have unique values in that dictionary. Consider,

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

so output should be [3] as key 3 has unique value which is not present in dict.

Now there is problem in given fuction:

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

I am getting error like:

File "main.py", line 14, in uniqueValues if aDict[key] == aDict[key1]: KeyError: 1

Where i am doing wrong?

Upvotes: 11

Views: 161213

Answers (2)

Use Counter from collections library:

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

Output:

[3, 4, 7]

Upvotes: -1

Emile
Emile

Reputation: 2971

Your main problem is this line:

dicta = aDict

You think you're making a copy of the dictionary, but actually you still have just one dictionary, so operations on dicta also change aDict (and so, you remove values from adict, they also get removed from aDict, and so you get your KeyError).

One solution would be

dicta = aDict.copy()

(You should also give your variables clearer names to make it more obvious to yourself what you're doing)

(edit) Also, an easier way of doing what you're doing:

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

Upvotes: 8

Related Questions