Как получить верхние «n» наиболее часто используемых слов из списка?

#python #python-3.x #list

#питон #python-3.x #Список

Вопрос:

У меня есть два списка. Каждый список включает в себя слова. Некоторые слова являются общими для обоих списков, некоторые — нет. Я хочу вывести только 20 наиболее часто встречающихся слов, но мой код показывает все распространенные слова. Я хочу ограничить диапазон до 20. Мне не разрешено использовать СЧЕТЧИК.

 def countwords(lst):
    dct = {}
    for word in lst:
        dct[word] = dct.get(word, 0)   1
    return dct


count1 = countwords(finallist1)
count2 = countwords(finallist2)

words1 = set(count1.keys())
words2 = set(count2.keys())

common_words = words1.intersection(words2)
for i,w in enumerate (common_words,1):
    print(f"{i}t{w}t{count1[w]}t{count2[w]}t{count1[w]   count2[w]}")
 

Ожидаемый результат:

 common   f1 f2 sum 
1 program 5 10 15 
2 python  2  4  6 
.
.
until 20
 

Ответ №1:

Вы можете использовать .most_common() collections.Counter для достижения этой цели:

 >>> from collections import Counter
>>> word_list = ["one", "two", "three", "four", "two", "three", "four", "three", "four", "four"]

>>> Counter(word_list).most_common(2)
[('four', 4), ('three', 3)]
 

Из Counter().most_common() документации :

Возвращает список «n» наиболее распространенных элементов и их количество от наиболее распространенных до наименьших. Если «n» опущено или отсутствует, most_common() возвращает все элементы в счетчике. Элементы с равным количеством упорядочиваются в порядке первого встреченного


Вот альтернатива для достижения того же самого без импорта какого-либо модуля:

 # Step 1: Create Counter dictionary holding frequency. 
#         Similar to: `collections.Counter()` 
my_counter = {}
for word in word_list:
    my_counter[word] = my_counter.get(word, 0)   1

# where `my_counter` will hold:
# {'four': 4, 'three': 3, 'two': 2, 'one': 1}
#-------------

# Step 2: Get sorted list holding word amp; frequency in descending order.
#         Similar to: `Counter.most_common()`
sorted_frequency = sorted(my_counter.iteritems(), key=lambda x: x[1], reverse=True)

# where `sorted_frequency` will hold:
# [('four', 4), ('three', 3), ('two', 2), ('one', 1)]
#-------------

# Step 3: Get top two words by slicing the ordered list from Step 2.
#         Similar to: `.most_common(2)`
top_two = sorted_frequency[:2]

# where `top_two` will hold:
# [('four', 4), ('three', 3)]
 

Пожалуйста, обратитесь к комментариям в приведенном выше фрагменте кода для пошагового объяснения.

Комментарии:

1. Мне не разрешено использовать счетчик. Извините.

2. @elomelo проверьте редактирование. еще один без импорта какого-либо модуля

3. @elomelo если этот ответ вам помог, вы можете повысить его, нажав стрелку вверх слева. Это поможет мне получить 10 дополнительных преимуществ репутации. Вы также можете пометить ответ как принятый (лучший ответ), щелкнув значок галочки слева от ответа