通过使用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
提前谢谢!
答案 0 :(得分:2)
itertools.groupby
假设您的示例中的字符串已排序,则可以将groupby
与statistics.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}