如何计算首字母大写时出现的单词的比例

时间:2019-01-18 10:54:41

标签: python string dictionary count word

通过使用Python,我想计算首字母大写的单词所占的比例。例如,这是一个示例单词列表,

word_list = ["capital", "Capital", "Capital", "Capital", "capital", "bus", "Bus", "bus", "Bus", "white"]

,我想产生如下结果:

{"Capital": 0.6, "Bus": 0.5, "White": 0}

您对此有任何想法吗?看起来很容易,但是很难找到好的解决方案。具体来说,使用defaultdict可以很容易地计算出首字母大写单词的数量。

word_dict = defaultdict(int)
for word in word_list:
    if word[0].isupper():
        word_dict[word] += 1

提前谢谢!

2 个答案:

答案 0 :(得分:2)

单词排序:itertools.groupby

假设您的示例中的字符串已排序,则可以将groupbystatistics.mean结合使用:

from itertools import groupby
from statistics import mean

grouper = groupby(word_list, key=str.casefold)
res = {k.capitalize(): mean(x[0].isupper() for x in words) for k, words in grouper}

# {'Bus': 0.5, 'Capital': 0.6, 'White': 0}

单词不一定要排序:sorted + groupby

在这种情况下,您可以按照上述逻辑在之前进行排序:

word_list = sorted(word_list, key=str.casefold)

如果您的列表未排序,这会增加算法的复杂性。

单词不一定要排序:collections.defaultdict

另一种方法是通过collections.defaultdict构建一个包含布尔值列表的字典,然后使用statistics.mean

from collections import defaultdict
from statistics import mean

dd = defaultdict(list)
for word in word_list:
    dd[word.capitalize()].append(word[0].isupper())

# defaultdict(list,
#             {'Bus': [False, True, False, True],
#              'Capital': [False, True, True, True, False],
#              'White': [False]})

res = {k: mean(v) for k, v in dd.items()}

# {'Bus': 0.5, 'Capital': 0.6, 'White': 0}

答案 1 :(得分:1)

您可以执行以下操作:

from collections import Counter

word_list = ["capital", "Capital", "Capital", "Capital", "capital", "bus", "Bus", "bus", "Bus", "white"]

# count them all while ignoring case
count = Counter(x.lower() for x in word_list)  

# count only the title-case ones
uppers = Counter(x.lower() for x in word_list if x[0].isupper())

# get frequency
res = {k.capitalize(): uppers.get(k, 0)/v for k, v in count.items()} 

这将产生所需的结果:

print(res)  # -> {'Capital': 0.6, 'Bus': 0.5, 'White': 0.0}