Reputation: 5444
I am looking for the most efficient way to count the number of letters in a list. I need something like
word=[h e l l o]
for i in alphabet:
for j in word:
if j==i:
## do something
Where alphabet should be the spanish alphabet, that is the english alphabet including the special character 'ñ'.
I have thought about creating a list of pairs in the form of [[a, 0], [b,1], ...] but I suppose there is a more efficient/clean way.
Upvotes: 1
Views: 823
Reputation: 180391
It is not actually a dupe as you want to filter to only count characters from a certain set, you can use a Counter dict to do the counting and a set of allowed characters to filter by:
word = ["h", "e", "l", "l", "o"]
from collections import Counter
from string import ascii_lowercase
# create a set of the characters you want to count.
allowed = set(ascii_lowercase + 'ñ')
# use a Counter dict to get the counts, only counting chars that are in the allowed set.
counts = Counter(s for s in word if s in allowed)
If you actually just want the total sum:
total = sum(s in allowed for s in word)
Or using a functional approach:
total = sum(1 for _ in filter(allowed.__contains__, word))
Using filter is going to be a bit faster for any approach:
In [31]: from collections import Counter
...: from string import ascii_lowercase, digits
...: from random import choice
...:
In [32]: chars = [choice(digits+ascii_lowercase+'ñ') for _ in range(100000)]
In [33]: timeit Counter(s for s in chars if s in allowed)
100 loops, best of 3: 36.8 ms per loop
In [34]: timeit Counter(filter(allowed.__contains__, chars))
10 loops, best of 3: 31.7 ms per loop
In [35]: timeit sum(s in allowed for s in chars)
10 loops, best of 3: 35.4 ms per loop
In [36]: timeit sum(1 for _ in filter(allowed.__contains__, chars))
100 loops, best of 3: 32 ms per loop
If you want a case insensitive match, use ascii_letters and add 'ñÑ'
:
from string import ascii_letters
allowed = set(ascii_letters+ 'ñÑ')
Upvotes: 2
Reputation: 399793
This is pretty easy:
import collections
print collections.Counter("señor")
This prints:
Counter({'s': 1, 'r': 1, 'e': 1, '\xa4': 1, 'o': 1})
Upvotes: 0