Jen
Jen

Reputation: 1191

Count how many times a dictionary value is found with more than one key

I'm working in python. Is there a way to count how many times values in a dictionary are found with more than one key, and then return a count?

So if for example I had 50 values and I ran a script to do this, I would get a count that would look something like this:

1: 23  
2: 15  
3: 7  
4: 5  

The above would be telling me that 23 values appear in 1 key, 15 values appear in 2 keys, 7 values appear in 3 keys and 5 values appear in 4 keys.

Also, would this question change if there were multiple values per key in my dictionary?

Here is a sample of my dictionary (it's bacteria names):

{'0': ['Pyrobaculum'], '1': ['Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium'], '3': ['Thermoanaerobacter', 'Thermoanaerobacter'], '2': ['Helicobacter', 'Mycobacterium'], '5': ['Thermoanaerobacter', 'Thermoanaerobacter'], '4': ['Helicobacter'], '7': ['Syntrophomonas'], '6': ['Gelria'], '9': ['Campylobacter', 'Campylobacter'], '8': ['Syntrophomonas'], '10': ['Desulfitobacterium', 'Mycobacterium']}

So from this sample, there are 8 unique values, I the ideal feedback I would get be:

1:4
2:3
3:1

So 4 bacteria names are only in one key, 3 bacteria are found in two keys and 1 bacteria is found in three keys.

Upvotes: 5

Views: 25608

Answers (3)

Paulo Almeida
Paulo Almeida

Reputation: 8071

If I understand correctly, you want to count the counts of dictionary values. If the values are countable by collections.Counter, you just need to call Counter on the dictionaries values and then again on the first counter's values. Here is an example using a dictionary where the keys are range(100) and the values are random between 0 and 10:

from collections import Counter
d = dict(enumerate([str(random.randint(0, 10)) for _ in range(100)]))
counter = Counter(d.values())
counts_counter = Counter(counter.values())

EDIT:

After the sample dictionary was added to the question, you need to do the first count in a slightly different way (d is the dictionary in the question):

from collections import Counter
c = Counter()
for v in d.itervalues():
    c.update(set(v))
Counter(c.values())

Upvotes: 5

user764357
user764357

Reputation:

So unless I'm reading this wrong you want to know:

  • For each of the values in the original dictionary, how many times does each different count of values occur?
  • In essence what you want is the frequency of the values in the dictionary

I took a less elegant approach that the other answers, but have broken the problem down for you into individual steps:

d = {'0': ['Pyrobaculum'], '1': ['Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium'], '3': ['Thermoanaerobacter', 'Thermoanaerobacter'], '2': ['Helicobacter', 'Mycobacterium'], '5': ['Thermoanaerobacter', 'Thermoanaerobacter'], '4': ['Helicobacter'], '7': ['Syntrophomonas'], '6': ['Gelria'], '9': ['Campylobacter', 'Campylobacter'], '8': ['Syntrophomonas'], '10': ['Desulfitobacterium', 'Mycobacterium']}

# Iterate through and find out how many times each key occurs
vals = {}                       # A dictonary to store how often each value occurs.
for i in d.values():
  for j in set(i):              # Convert to a set to remove duplicates
    vals[j] = 1 + vals.get(j,0) # If we've seen this value iterate the count
                                # Otherwise we get the default of 0 and iterate it
print vals

# Iterate through each possible freqency and find how many values have that count.
counts = {}                     # A dictonary to store the final frequencies.
# We will iterate from 0 (which is a valid count) to the maximum count
for i in range(0,max(vals.values())+1):
    # Find all values that have the current frequency, count them
    #and add them to the frequency dictionary
    counts[i] = len([x for x in vals.values() if x == i])

for key in sorted(counts.keys()):
  if counts[key] > 0:
     print key,":",counts[key]

You can also test this code on codepad.

Upvotes: 6

iruvar
iruvar

Reputation: 23384

You could use a Counter

>>>from collections import Counter
>>>d = dict(((1, 1), (2, 1), (3, 1), (4, 2), (5, 2), (6, 3), (7, 3)))
>>>d
{1: 1, 2: 1, 3: 1, 4: 2, 5: 2, 6: 3, 7: 3}
>>>Counter(d.values())
Counter({1: 3, 2: 2, 3: 2})

Upvotes: 2

Related Questions