在循环中使用字母作为计数器

时间:2016-10-19 10:56:53

标签: python list character

我正在寻找一种最有效的方法来计算列表中的字母数。我需要像

这样的东西
word=[h e l l o]

for i in alphabet:
   for j in word:
      if j==i:
         ## do something

字母应该是西班牙语字母,即英文字母,包括特殊字符'ñ'

我已经考虑过以[[a,0],[b,1],...]的形式创建一对对象列表,但我想有一种更有效/更干净的方式。

2 个答案:

答案 0 :(得分:2)

它实际上并不是一个欺骗,因为你想要过滤只计算某个集合中的字符,你可以使用Counter dict进行计数,并使用一组允许的字符进行过滤:

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)

如果你真的只想要总和:

total = sum(s in allowed for s in word)

或使用功能性方法:

total = sum(1 for _ in filter(allowed.__contains__, word))
对于任何方法,

使用过滤器会更快一些:

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

如果您想要不区分大小写的匹配项,请使用 ascii_letters 并添加'ñÑ'

from string import ascii_letters

allowed = set(ascii_letters+ 'ñÑ')

答案 1 :(得分:0)

这很简单:

import collections
print collections.Counter("señor")

打印:

Counter({'s': 1, 'r': 1, 'e': 1, '\xa4': 1, 'o': 1})