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

Считать частоту слов в списке и отсортировать по частоте

Я использую Python 3.3

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

Я должен отсортировать список уникальных слов на основе списка частот, чтобы слово с самой высокой частотой было первым в списке.

У меня есть дизайн в тексте, но я не уверен, как реализовать его в Python.

Методы, которые я нашел до сих пор, используют либо Counter либо словари, которые мы не изучили. Я уже создал список из файла, содержащего все слова, но не знаю, как найти частоту каждого слова в списке. Я знаю, что мне понадобится цикл, чтобы сделать это, но не могу понять это.

Вот основной дизайн:

 original list = ["the", "car",....]
 newlst = []
 frequency = []
 for word in the original list
       if word not in newlst:
           newlst.append(word)
           set frequency = 1
       else
           increase the frequency
 sort newlst based on frequency list 
4b9b3361

Ответ 1

используйте этот

from collections import Counter
list1=['apple','egg','apple','banana','egg','apple']
counts = Counter(list1)
print(counts)
# Counter({'apple': 3, 'egg': 2, 'banana': 1})

Ответ 2

Ты можешь использовать

from collections import Counter

Он поддерживает Python 2.7, подробнее читайте здесь

1.

>>>c = Counter('abracadabra')
>>>c.most_common(3)
[('a', 5), ('r', 2), ('b', 2)]

использовать дикт

>>>d={1:'one', 2:'one', 3:'two'}
>>>c = Counter(d.values())
[('one', 2), ('two', 1)]

Но сначала вы должны прочитать файл и преобразовать его в dict.

2. это пример документации на python, используйте re и Counter

# Find the ten most common words in Hamlet
>>> import re
>>> words = re.findall(r'\w+', open('hamlet.txt').read().lower())
>>> Counter(words).most_common(10)
[('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631),
 ('you', 554),  ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]

Ответ 3

words = file("test.txt", "r").read().split() #read the words into a list.
uniqWords = sorted(set(words)) #remove duplicate words and sort
for word in uniqWords:
    print words.count(word), word

Ответ 4

Вы можете использовать reduce() - функциональный способ.

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}

Ответ 5

Один из способов - составить список списков с каждым под списком в новом списке, содержащем слово и счетчик:

list1 = []    #this is your original list of words
list2 = []    #this is a new list

for word in list1:
    if word in list2:
        list2.index(word)[1] += 1
    else:
        list2.append([word,0])

Или, более эффективно:

for word in list1:
    try:
        list2.index(word)[1] += 1
    except:
        list2.append([word,0])

Это будет менее эффективно, чем использование словаря, но оно использует более основные понятия.

Ответ 6

Еще одно решение с другим алгоритмом без использования коллекций:

def countWords(A):
   dic={}
   for x in A:
       if not x in  dic:        #Python 2.7: if not dic.has_key(x):
          dic[x] = A.count(x)
   return dic

dic = countWords(['apple','egg','apple','banana','egg','apple'])
sorted_items=sorted(dic.items())   # if you want it sorted

Ответ 7

Идеальный способ - использовать словарь, который сопоставляет слово с ним. Но если вы не можете использовать это, вы можете использовать 2 списка - 1 для хранения слов, а другое - для хранения слов. Обратите внимание, что порядок слов и вопросов имеет значение. Реализация этого будет сложной и не очень эффективной.

Ответ 8

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

# The list you already have
word_list = ['words', ..., 'other', 'words']
# Get a set of unique words from the list
word_set = set(word_list)
# create your frequency dictionary
freq = {}
# iterate through them, once per unique word.
for word in word_set:
    freq[word] = word_list.count(word) / float(len(word_list))

Частота будет равна частоте каждого слова в списке, который у вас уже есть.

Вам понадобится float, чтобы преобразовать одно из целых чисел в float, поэтому результирующее значение будет float.

Edit:

Если вы не можете использовать dict или set, вот еще один менее эффективный способ:

# The list you already have
word_list = ['words', ..., 'other', 'words']
unique_words = []
for word in word_list:
    if word not in unique_words:
        unique_words += [word]
word_frequencies = []
for word in unique_words:
    word_frequencies += [float(word_list.count(word)) / len(word_list)]
for i in range(len(unique_words)):
    print(unique_words[i] + ": " + word_frequencies[i])

Знаки unique_words и word_frequencies будут соответствовать.

Ответ 9

Попробуйте следующее:

words = []
freqs = []

for line in sorted(original list): #takes all the lines in a text and sorts them
    line = line.rstrip() #strips them of their spaces
    if line not in words: #checks to see if line is in words
        words.append(line) #if not it adds it to the end words
        freqs.append(1) #and adds 1 to the end of freqs
    else:
        index = words.index(line) #if it is it will find where in words
        freqs[index] += 1 #and use the to change add 1 to the matching index in freqs

Ответ 10

Вот код поддержки вашего вопроса is_char() проверка для проверки количества строк только эти строки, Hashmap это словарь в Python

def is_word(word):
   cnt =0
   for c in word:

      if 'a' <= c <='z' or 'A' <= c <= 'Z' or '0' <= c <= '9' or c == '$':
          cnt +=1
   if cnt==len(word):
      return True
  return False

def words_freq(s):
  d={}
  for i in s.split():
    if is_word(i):
        if i in d:
            d[i] +=1
        else:
            d[i] = 1
   return d

 print(words_freq('the the sky$ is blue not green'))

Ответ 11

d={i : a.count(i)  for i in a}
print(d)

Ответ 12

лучше всего сделать следующее:

def wordListToFreqDict(wordlist):
    wordfreq = [wordlist.count(p) for p in wordlist]
    return dict(zip(wordlist, wordfreq))

затем попробуйте:          wordListToFreqDict(originallist)