Posts: 67
Threads: 25
Joined: Jun 2018
Mar-26-2020, 07:11 PM
(This post was last modified: Mar-26-2020, 07:19 PM by 3Pinter.)
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.
Posts: 1,838
Threads: 2
Joined: Apr 2017
Posts: 67
Threads: 25
Joined: Jun 2018
Mar-26-2020, 07:58 PM
(This post was last modified: Mar-26-2020, 08:00 PM by 3Pinter.)
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)
Posts: 6,794
Threads: 20
Joined: Feb 2020
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
Posts: 67
Threads: 25
Joined: Jun 2018
yes. that looks like what I want to achieve.
your approach looks more logical than mine, thanks!
Posts: 67
Threads: 25
Joined: Jun 2018
on second thoughts: how to return the dictionary item (key+val)?
I think that dictionary isn't the logical approach for this?
|