Kara
Kara

Reputation: 785

Python count in a sublist in a nest list

x = [['a', 'b', 'c'], ['a', 'c', 'd'], ['e', 'f', 'f']]

Let's say we have a list with random str letters. How can i create a function so it tells me how many times the letter 'a' comes out, which in this case 2. Or any other letter, like 'b' comes out once, 'f' comes out twice. etc. Thank you!

Upvotes: 1

Views: 886

Answers (3)

monkut
monkut

Reputation: 43830

Just FYI, you can use sum() to flatten a single nested list.

>>> from collections import Counter
>>>
>>> x = [['a', 'b', 'c'], ['a', 'c', 'd'], ['e', 'f', 'f']]
>>> c = Counter(sum(x, []))
>>> c
Counter({'a': 2, 'c': 2, 'f': 2, 'b': 1, 'e': 1, 'd': 1})

But, as Blender and John Clements have addressed, itertools.chain.from_iterable() may be more clear.

>>> from itertools import chain
>>> c = Counter(chain.from_iterable(x)))
>>> c
Counter({'a': 2, 'c': 2, 'f': 2, 'b': 1, 'e': 1, 'd': 1})

Upvotes: 0

Blender
Blender

Reputation: 298166

You could flatten the list and use collections.Counter:

>>> import collections
>>> x = [['a', 'b', 'c'], ['a', 'c', 'd'], ['e', 'f', 'f']]
>>> d = collections.Counter(e for sublist in x for e in sublist)
>>> d
Counter({'a': 2, 'c': 2, 'f': 2, 'b': 1, 'e': 1, 'd': 1})
>>> d['a']
2

Upvotes: 6

Explosion Pills
Explosion Pills

Reputation: 191749

import itertools, collections
result = collections.defaultdict(int)
for i in itertools.chain(*x):
    result[i] += 1

This will create result as a dictionary with the characters as keys and their counts as values.

Upvotes: 1

Related Questions