Python Forum

Full Version: unique (single) value in dict (or list)
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Given any random dictionary (or a list doesnt matter), how to ask the dictionary if there is an unique value (so which only occurs once).

{
"1": "a",
"2": "b",
"1": "c",
"1": "c",
"1": "33",
"1": "a"
}

--> No unique value is found ... or technically 2 (b and 33) are found, but I only want 1.
so not desired result ... therefor errorhandling or so.

{
"1": "a",
"2": "b",
"1": "c",
"1": "c",
"1": "c",
"1": "a"
}

--> Unique value is found (b) ... do something.

What would your approach be?
Set returns all unique values but I'm not after that.
What have you tried?
Still unsure about the approach ndc85430, but thinking about something like this.



mylist = [ [1, "a"], [2, "b"], [1, "c"], [1, "c"],  [1, "c"], [1, "a"] ]

test = [a[1] for a in mylist]
# ['a', 'b', 'c', 'c', '33', 'a']

from collections import Counter
collection_counter = Counter(test)
for m in mylist:
    print "element {} num of times: {}".format(m[0], collection_counter.get(m[1]))

num_occurance = 0
newlist = ""
for key in collection_counter: 
    if collection_counter[key] == 1: 
        num_occurance = num_occurance + 1
        newlist = key
print num_occurance

if num_occurance == 1:
    print "unique value found: {}".format(newlist)
    print [x for x in mylist if x[1] == newlist]
else:
    print "bummer, no uniques found"
        
    
mylist = [ [1, "a"], [2, "b"], [1, "c"], [1, "c"],  [1, "c"], [1, "a"] ]
#[[2, 'b']]
#(annoying nested list ..grrr)

mylist = [ [1, "a"], [2, "b"], [1, "c"], [1, "c"],  [1, "33"], [1, "a"] ]
# bummer, no uniques found 
#(annoying nested list ..grrr)
Like this?
items1 = {1:1, 2:2, 3:3}
items2 = {1:1, 2:1, 3:2, 4:2, 5:3}
items3 = {1:1, 2:1, 3:3, 4:5, 5:4}

def find_unique(d):
    value_list = list(d.values())
    value_set = set(value_list)
    if len(value_set) == len(value_list):
        return None # All values are unique

    unique = None
    for value in value_set:
        if value_list.count(value) == 1:
            if unique is None:
                unique = value
            else:
                return None # Already found a unique value
    return unique

print(items1, '  Unique =', find_unique(items1))
print(items2, '  Unique =', find_unique(items2))
print(items3, '  Unique =', find_unique(items3))
Output:
{1: 1, 2: 2, 3: 3} Unique = None {1: 1, 2: 1, 3: 2, 4: 2, 5: 3} Unique = 3 {1: 1, 2: 1, 3: 3, 4: 5, 5: 4} Unique = None
yes. that looks like what I want to achieve.

your approach looks more logical than mine, thanks!
on second thoughts: how to return the dictionary item (key+val)?

I think that dictionary isn't the logical approach for this?