wake-up-neo.net

Zählen Sie die Häufigkeit der Wörter in einer Liste und sortieren Sie sie nach Häufigkeit

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 
55
user3088605

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})
112

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)]
35
tdolydong
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
16
kyle k

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}
3
Gadi

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.

2
Milo P

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
2
Reza Abtin

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.

1
Karan Goel

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.

1
johannestaas

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)
0
Michaelpanicci

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'))
0
skay

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
0
Paige Goulding