Подтвердить что ты не робот

Частота счета предметов в Python

Предположим, у меня есть список слов, и я хочу узнать, сколько раз каждое слово появляется в этом списке.

Очевидный способ сделать это:

words = "apple banana apple strawberry banana lemon"
uniques = set(words.split())
freqs = [(item, words.split().count(item)) for item in uniques]
print(freqs)

Но я нахожу этот код не очень хорошим, потому что программа запускает список слов дважды, один раз, чтобы построить набор, и второй, чтобы посчитать количество появлений.

Конечно, я мог бы написать функцию для запуска списка и подсчета, но это не было бы так Pythonic. Итак, есть ли более эффективный и Pythonic способ?

4b9b3361

Ответ 1

defaultdict на помощь!

from collections import defaultdict

words = "apple banana apple strawberry banana lemon"

d = defaultdict(int)
for word in words.split():
    d[word] += 1

Это выполняется в O (n).

Ответ 2

Класс Counter в модуле collections специально создан для решения этой проблемы:

from collections import Counter
words = "apple banana apple strawberry banana lemon"
Counter(words.split())
# Counter({'apple': 2, 'banana': 2, 'strawberry': 1, 'lemon': 1})

Ответ 3

Стандартный подход:

from collections import defaultdict

words = "apple banana apple strawberry banana lemon"
words = words.split()
result = defaultdict(int)
for word in words:
    result[word] += 1

print result

Groupby oneliner:

from itertools import groupby

words = "apple banana apple strawberry banana lemon"
words = words.split()

result = dict((key, len(list(group))) for key, group in groupby(sorted(words)))
print result

Ответ 4

freqs = {}
for word in words:
    freqs[word] = freqs.get(word, 0) + 1 # fetch and increment OR initialize

Я думаю, что это приводит к тому же, что и решение Triptych, но без импорта коллекций. Также немного похоже на решение Selinap, но более читаемое имхо. Почти идентичен решению Томаса Вейгеля, но без использования исключений.

Это может быть медленнее, чем использование defaultdict() из библиотеки коллекций. Поскольку значение извлекается, увеличивается, а затем назначается снова. Вместо того, чтобы просто увеличивать. Однако использование + = может делать то же самое внутри.

Ответ 5

Если вы не хотите использовать стандартный метод словаря (циклический переход по списку, увеличивающий правильную кнопку dict), вы можете попробовать следующее:

>>> from itertools import groupby
>>> myList = words.split() # ['apple', 'banana', 'apple', 'strawberry', 'banana', 'lemon']
>>> [(k, len(list(g))) for k, g in groupby(sorted(myList))]
[('apple', 2), ('banana', 2), ('lemon', 1), ('strawberry', 1)]

Он запускается в O (n log n) времени.

Ответ 6

Без defaultdict:

words = "apple banana apple strawberry banana lemon"
my_count = {}
for word in words.split():
    try: my_count[word] += 1
    except KeyError: my_count[word] = 1

Ответ 7

Не можете ли вы использовать счет?

words = 'the quick brown fox jumps over the lazy gray dog'
words.count('z')
#output: 1

Ответ 8

Мне довелось работать над некоторыми упражнениями Spark, вот мое решение.

tokens = ['quick', 'brown', 'fox', 'jumps', 'lazy', 'dog']

print {n: float(tokens.count(n))/float(len(tokens)) for n in tokens}

** # вывод вышеуказанного **

{'brown': 0.16666666666666666, 'lazy': 0.16666666666666666, 'jumps': 0.16666666666666666, 'fox': 0.16666666666666666, 'dog': 0.16666666666666666, 'quick': 0.16666666666666666}

Ответ 9

Используйте reduce(), чтобы преобразовать список в один dict.

words = "apple banana apple strawberry banana lemon"
reduce( lambda d, c: d.update([(c, d.get(c,0)+1)]) or d, words.split(), {})

возвращает

{'strawberry': 1, 'lemon': 1, 'apple': 2, 'banana': 2}

Ответ 10

words = "apple banana apple strawberry banana lemon"
w=words.split()
e=list(set(w))       
for i in e:
   print(w.count(i))    #Prints frequency of every word in the list

Надеюсь, это поможет!

Ответ 11

Ниже приведено несколько дополнительных циклов, но это еще один метод

def func(tup):
    return tup[-1]


def print_words(filename):
    f = open("small.txt",'r')
    whole_content = (f.read()).lower()
    print whole_content
    list_content = whole_content.split()
    dict = {}
    for one_word in list_content:
        dict[one_word] = 0
    for one_word in list_content:
        dict[one_word] += 1
    print dict.items()
    print sorted(dict.items(),key=func)