Ответ 1
используйте этот
from collections import Counter
list1=['apple','egg','apple','banana','egg','apple']
counts = Counter(list1)
print(counts)
# Counter({'apple': 3, 'egg': 2, 'banana': 1})
Я использую 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
используйте этот
from collections import Counter
list1=['apple','egg','apple','banana','egg','apple']
counts = Counter(list1)
print(counts)
# Counter({'apple': 3, 'egg': 2, 'banana': 1})
Ты можешь использовать
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)]
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
Вы можете использовать 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}
Один из способов - составить список списков с каждым под списком в новом списке, содержащем слово и счетчик:
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])
Это будет менее эффективно, чем использование словаря, но оно использует более основные понятия.
Еще одно решение с другим алгоритмом без использования коллекций:
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
Идеальный способ - использовать словарь, который сопоставляет слово с ним. Но если вы не можете использовать это, вы можете использовать 2 списка - 1 для хранения слов, а другое - для хранения слов. Обратите внимание, что порядок слов и вопросов имеет значение. Реализация этого будет сложной и не очень эффективной.
Использование счетчика будет лучшим способом, но если вы не хотите этого делать, вы можете реализовать его самостоятельно таким образом.
# 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
будут соответствовать.
Попробуйте следующее:
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
Вот код поддержки вашего вопроса 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'))
d={i : a.count(i) for i in a}
print(d)
лучше всего сделать следующее:
def wordListToFreqDict(wordlist):
wordfreq = [wordlist.count(p) for p in wordlist]
return dict(zip(wordlist, wordfreq))
затем попробуйте: wordListToFreqDict(originallist)