Python - считать каждую букву в списке слов

1

Итак, у меня есть список слов ` 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"

  • 1
    В вашем примере y в 3 словах, а p только в 2, поэтому результат должен иметь y перед p.
Теги:
algorithm
dictionary
collections

6 ответов

5
Лучший ответ
cnt = Counter()
for words in wordList:
      for letters in set(words):
          cnt[letters]+=1
6

Добавьте вызов set:

cnt = Counter()
for word in wordList:
      for letter in set(word):
          cnt[letter]+=1
3

Альтернативный подход с использованием комбинаторов итераторов в itertools:

import collections
import itertools

cnt = collections.Counter(itertools.chain.from_iterable(itertools.imap(set, wordList)))
  • 0
    Вы действительно должны использовать chain.from_iterable, иначе расширение * arg заставит imap быть оцененным сразу
  • 0
    @gnibbler Спасибо за напоминание --- старые привычки умирают тяжело!
2

Вы можете исключить 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']
2
cnt = Counter()
for word in wordList:
    lSet = set(word)
    for letter in lSet:
        cnt[letter] +=1             
  • 0
    Это не правильно, как написано.
  • 0
    Спасибо, я исправил опечатку
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']

Ещё вопросы

Сообщество Overcoder
Наверх
Меню