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


76

Ich benutze Python 3.3

Ich muss zwei Listen erstellen, eine für die eindeutigen Wörter und die andere für die Häufigkeit des Wortes.

Ich muss die eindeutige Wortliste anhand der Häufigkeitsliste sortieren, damit das Wort mit der höchsten Häufigkeit an erster Stelle in der Liste steht.

Ich habe das Design im Text, bin mir aber nicht sicher, wie ich es in Python implementieren soll.

Die Methoden, die ich bisher gefunden habe, verwenden entweder CounterWörterbücher 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 der einzelnen Wörter in der Liste ermittelt werden soll. Ich weiß, dass ich dazu eine Schleife brauche, kann es aber 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 

1
Es fällt uns schwer zu wissen, was Sie wissen. Haben Sie gelernt set? die countMethode der Listen? usw. Banden Sie das Problem in sinnvollen Begriffen.
Roippi

2
Warum darfst du keine Dinge benutzen, die dir nicht beigebracht wurden? Wird das Lernen im Voraus heutzutage entmutigt?
John La Rooy

Ein Trie wäre eine ziemlich effiziente Alternative. Sie können eine mit nur Listen erstellen
John La Rooy

2
Bitte akzeptieren Sie eine Antwort.
PatrickT

Antworten:


152

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

3
stellar Lösung
Chris Dormani

48

Sie können verwenden

from collections import Counter

Es unterstützt Python 2.7. Weitere Informationen finden Sie hier

1.

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

benutze dict

>>>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 Dikt konvertieren.

2. Es ist das Beispiel für Python-Dokumente. Verwenden Sie re und 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)]

18
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

Ein großartiger pythonischer Weg!
Karlgzafiris

6
Haben Sie den Code mit einer großen Datei getestet? Wenn die Datei zu groß ist, kostet dies viel Zeit. Sammlung ist effizienter.
Tony Wang

Dies ist schlechter als Counter. Sie werfen die Zählungen unnötig weg, wenn Sie dies tun set(words), und müssen dann jedes Mal, wenn Sie die Zählungen benötigen, nachschlagen words.count(word), was insbesondere ineffizient ist. für große Texte.
smci

6

Noch eine 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

5

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 haben möchten, ist es so einfach wie:

pd.Series(original_list).value_counts().sort_values(ascending=True)

4

Eine Möglichkeit wäre, eine Liste von Listen zu erstellen, wobei jede Unterliste in der neuen Liste ein Wort und eine Anzahl 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, verwendet jedoch grundlegendere Konzepte.


4

Sie können redu () verwenden - eine funktionale Methode.

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}

2

Die Verwendung von Counter wäre der beste Weg, aber wenn Sie dies nicht möchten, können Sie es selbst auf diese Weise 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 wird mit der Häufigkeit jedes Wortes in der Liste enden, die Sie bereits haben.

Sie müssen floatdort eine der Ganzzahlen in einen Float konvertieren, sodass der resultierende Wert ein Float ist.

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_wordsund word_frequencieswerden übereinstimmen.


1

Der ideale Weg ist, ein Wörterbuch zu verwenden, das ein Wort seiner Anzahl zuordnet. Wenn Sie dies jedoch nicht verwenden können, möchten Sie möglicherweise zwei Listen verwenden - eine, in der die Wörter gespeichert sind, und die andere, in der die Anzahl der Wörter gespeichert ist. Beachten Sie, dass hier die Reihenfolge der Wörter und Zählungen von Bedeutung ist. Dies umzusetzen wäre schwierig und nicht sehr effizient.


Es stellt sich heraus, dass ich es auf die harte Tour machen muss, also brauche ich zwei Listen. Ich habe die Wörter gespeichert, bin mir aber nicht sicher, wie ich die Frequenzen so speichern soll, dass ich die Wortliste anhand der Frequenzliste sortieren kann.
user3088605

0

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

Hier ist Codeunterstützung Ihre Frage is_char () prüft, ob die Anzahl der Zeichenfolgen überprüft wird. Hashmap ist ein Wörterbuch in 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'))

-2

das beste zu tun ist :

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

dann versuchen Sie: wordListToFreqDict(originallist)


1
Dies ist kaum der "beste" Weg, dies zu tun. Sie müssen den Text nur einmal durchlaufen, um die Häufigkeit der Wörter zu zählen, während Sie hier für jedes einzelne Wort einen Durchgang durchführen.
juanpa.arrivillaga

Es wird nicht einmal die Einschränkung für jedes einzelne Wort hinzugefügt.
MonsieurBeilto
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.