2013-12-11 1 views
35

Я использую 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 
+1

нам сложно знать, что вы знаете. Вы узнали «набор»? метод подсчета списков? и т. д. Связать проблему в значимых терминах. – roippi

+1

Почему вы не можете использовать то, чему вас не научили? Неужели обучение в наши дни не поощряется? –

+0

[Trie] (http://en.wikipedia.org/wiki/Trie) будет довольно эффективной альтернативой. Вы можете построить его с помощью только списков –

ответ

1

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

+0

Оказывается, мне нужно сделать трудный путь, поэтому мне нужны два списка. У меня есть слова, которые хранятся, но не уверены, как хранить частоты таким образом, чтобы я мог сортировать список слов на основе списка частот. – user3088605

0

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

# 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, чтобы преобразовать одно из целых чисел в поплавок, поэтому результирующее значение будет поплавка.

Edit:

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

# 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]) 

В indicies из unique_words и word_frequencies будут совпадать.

12
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 
+0

Отличный питонский путь! – Bishop

+2

вы проверили код с большим файлом? Если файл слишком велик, он будет стоить много времени. сбор более эффективен. –

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

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

27

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

from collections import Counter 

Он поддерживает Python 2.7, дополнительная информация here

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

Но, Вы должны сначала прочитать файл, и преобразуется в Сыроватского.

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

# 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)] 
81

использовать этот

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

звездное решение –

1

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

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 
3

Вы можете использовать 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} 
0

Попробуйте это:

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

лучшее, что нужно сделать, это:

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

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

+0

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

+0

Он даже не добавляет ограничение для каждого уникального слова. – MonsieurBeilto

Смежные вопросы