Ich benutze Python 3.3
Ich muss zwei Listen erstellen, eine für die einzigartigen Wörter und die andere für die Häufigkeit des Wortes.
Ich muss die eindeutige Wortliste anhand der Häufigkeitsliste sortieren, sodass das Wort mit der höchsten Häufigkeit an erster Stelle der Liste steht.
Ich habe das Design im Text, bin aber nicht sicher, wie ich es in Python implementieren soll.
Die Methoden, die ich bisher gefunden habe, verwenden entweder Counter
oder Wörterbücher, die wir nicht gelernt haben. Ich habe die Liste bereits aus der Datei erstellt, die alle Wörter enthält, weiß jedoch nicht, wie die Häufigkeit jedes einzelnen Wortes in der Liste zu finden ist. Ich weiß, ich brauche eine Schleife, aber ich kann es nicht herausfinden.
Hier ist das grundlegende Design:
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
benutze das
from collections import Counter
list1=['Apple','Egg','Apple','banana','Egg','Apple']
counts = Counter(list1)
print(counts)
# Counter({'Apple': 3, 'Egg': 2, 'banana': 1})
Sie können verwenden
from collections import Counter
Es unterstützt Python 2.7 , Lesen Sie weitere Informationen hier
1.
>>>c = Counter('abracadabra')
>>>c.most_common(3)
[('a', 5), ('r', 2), ('b', 2)]
benutze Dikt
>>>d={1:'one', 2:'one', 3:'two'}
>>>c = Counter(d.values())
[('one', 2), ('two', 1)]
Sie müssen jedoch zuerst die Datei lesen und in Diktate konvertieren.
2 . Es ist das Beispiel für Python-Dokumente
# 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
Sie können verkleinern () verwenden - Ein funktionaler Weg.
words = "Apple banana Apple strawberry banana lemon"
reduce( lambda d, c: d.update([(c, d.get(c,0)+1)]) or d, words.split(), {})
kehrt zurück:
{'strawberry': 1, 'lemon': 1, 'Apple': 2, 'banana': 2}
Eine Möglichkeit wäre, eine Liste mit Listen zu erstellen, wobei jede Unterliste in der neuen Liste ein Word und eine Zählung enthält:
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])
Oder effizienter:
for Word in list1:
try:
list2.index(Word)[1] += 1
except:
list2.append([Word,0])
Dies wäre weniger effizient als die Verwendung eines Wörterbuchs, es werden jedoch mehr grundlegende Konzepte verwendet.
Eine weitere Lösung mit einem anderen Algorithmus ohne Verwendung von Sammlungen:
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
Der ideale Weg ist die Verwendung eines Wörterbuchs, das ein Wort seiner Zählung zuordnet. Wenn Sie das nicht verwenden können, möchten Sie möglicherweise zwei Listen verwenden - eine, die die Wörter speichert, und die andere, die die Anzahl der Wörter speichert. Beachten Sie, dass hier die Reihenfolge der Wörter und der Zahlen von Bedeutung ist. Dies zu implementieren wäre schwierig und nicht sehr effizient.
Counter wäre der beste Weg, aber wenn Sie das nicht wollen, können Sie es selbst so implementieren.
# 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))
freq endet mit der Häufigkeit jedes Wortes in der Liste, die Sie bereits haben.
Sie müssen dort float
eingeben, um eine der Ganzzahlen in einen Float umzuwandeln. Der resultierende Wert ist also ein Float.
Bearbeiten:
Wenn Sie kein Diktat oder Set verwenden können, gibt es einen anderen, weniger effizienten Weg:
# 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])
Die Angaben von unique_words
und Word_frequencies
stimmen überein.
Pandas Antwort:
import pandas as pd
original_list = ["the", "car", "is", "red", "red", "red", "yes", "it", "is", "is", "is"]
pd.Series(original_list).value_counts()
Wenn Sie es stattdessen in aufsteigender Reihenfolge wünschen, ist es so einfach wie:
pd.Series(original_list).value_counts().sort_values(ascending=True)
Hier ist der Code, der Ihre Frage unterstützt
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'))
Versuche dies:
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