отсортированных слов: 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}