Using a dictionary to count the items in a list

Python

Python Problem Overview


I'm new to Python and I have a simple question, say I have a list of items:

['apple','red','apple','red','red','pear']

Whats the simpliest way to add the list items to a dictionary and count how many times the item appears in the list.

So for the list above I would like the output to be:

{'apple': 2, 'red': 3, 'pear': 1}

Python Solutions


Solution 1 - Python

in 2.7 and 3.1 there is special Counter dict for this purpose.

>>> from collections import Counter
>>> Counter(['apple','red','apple','red','red','pear'])
Counter({'red': 3, 'apple': 2, 'pear': 1})

Solution 2 - Python

I like:

counts = dict()
for i in items:
  counts[i] = counts.get(i, 0) + 1

.get allows you to specify a default value if the key does not exist.

Solution 3 - Python

Simply use list property count\

i = ['apple','red','apple','red','red','pear']
d = {x:i.count(x) for x in i}
print d

output :

{'pear': 1, 'apple': 2, 'red': 3}

Solution 4 - Python

>>> L = ['apple','red','apple','red','red','pear']
>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> for i in L:
...   d[i] += 1
>>> d
defaultdict(<type 'int'>, {'pear': 1, 'apple': 2, 'red': 3})

Solution 5 - Python

I always thought that for a task that trivial, I wouldn't want to import anything. But i may be wrong, depending on collections.Counter being faster or not.

items = "Whats the simpliest way to add the list items to a dictionary "

stats = {}
for i in items:
    if i in stats:
        stats[i] += 1
    else:
        stats[i] = 1

# bonus
for i in sorted(stats, key=stats.get):
    print("%d×'%s'" % (stats[i], i))

I think this may be preferable to using count(), because it will only go over the iterable once, whereas count may search the entire thing on every iteration. I used this method to parse many megabytes of statistical data and it always was reasonably fast.

Solution 6 - Python

Consider collections.Counter (available from python 2.7 onwards). https://docs.python.org/2/library/collections.html#collections.Counter

Solution 7 - Python

How about this:

src = [ 'one', 'two', 'three', 'two', 'three', 'three' ]
result_dict = dict( [ (i, src.count(i)) for i in set(src) ] )

This results in

> {'one': 1, 'three': 3, 'two': 2}

Solution 8 - Python

L = ['apple','red','apple','red','red','pear']
d = {}
[d.__setitem__(item,1+d.get(item,0)) for item in L]
print d 

Gives {'pear': 1, 'apple': 2, 'red': 3}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSophieView Question on Stackoverflow
Solution 1 - PythonOdomontoisView Answer on Stackoverflow
Solution 2 - PythonmmmdregView Answer on Stackoverflow
Solution 3 - PythonAshish Kumar VermaView Answer on Stackoverflow
Solution 4 - Pythonmechanical_meatView Answer on Stackoverflow
Solution 5 - PythonStefano PalazzoView Answer on Stackoverflow
Solution 6 - PythonPradyotView Answer on Stackoverflow
Solution 7 - PythonrivieraView Answer on Stackoverflow
Solution 8 - PythonNick TView Answer on Stackoverflow