Итак, у меня есть список слов ` wordList = list(). ' Прямо сейчас, я рассчитываю каждую букву в каждом из слов по всему списку, используя этот код
cnt = Counter()
for words in wordList:
for letters in words:
cnt[letters]+=1
Однако, я хочу, чтобы это считалось по-разному. Я хочу, чтобы функция находила самую общую букву из всех слов в списке, но только путем подсчета каждой буквы на одно слово (игнорируя тот факт, что некоторые слова могут иметь несколько копий одной и той же буквы).
Например, если список содержит "happy, harpy и hasty", два p в счастливом случае должны учитываться только один раз. Поэтому функция должна возвращать список наивысших частотных букв (по порядку) без двойного подсчета. В приведенном выше случае это было бы "h, a, p, y, r, s"
cnt = Counter()
for words in wordList:
for letters in set(words):
cnt[letters]+=1
Добавьте вызов set
:
cnt = Counter()
for word in wordList:
for letter in set(word):
cnt[letter]+=1
Альтернативный подход с использованием комбинаторов итераторов в itertools
:
import collections
import itertools
cnt = collections.Counter(itertools.chain.from_iterable(itertools.imap(set, wordList)))
Вы можете исключить for
с помощью update
, который обновляет счетчик из итерабельной (в данном случае строки):
from collections import Counter
words = 'happy harpy hasty'.split()
c=Counter()
for word in words:
c.update(set(word))
print c.most_common()
print [a[0] for a in c.most_common()]
[('a', 3), ('h', 3), ('y', 3), ('p', 2), ('s', 1), ('r', 1), ('t', 1)]
['a', 'h', 'y', 'p', 's', 'r', 't']
cnt = Counter()
for word in wordList:
lSet = set(word)
for letter in lSet:
cnt[letter] +=1
Это создает набор из каждого слова и передает их конструктору счетчика.
>>> from itertools import chain, imap
>>> from operator import itemgetter
>>> from collections import Counter
>>> words = 'happy', 'harpy', 'hasty'
>>> counter = Counter(chain.from_iterable(imap(set, words)))
>>> map(itemgetter(0), counter.most_common())
['a', 'h', 'y', 'p', 's', 'r', 't']