2011-12-17 45 views
0

試圖打印出現的單詞和數量。這樣的:如何使用列表生成器來處理單詞及其出現次數?

a aba aaa 
dd ddd dd 

我出shold包含:

[[a,1],[dd,2],[aba ,1],[ddd,1],[aaa,1]] 

卻是:

[[a,1],[dd,2],[aba ,1],[dd,2],[ddd,1],[aaa,1]] 

這裏是全碼:

在1.txt的

import re 

def get_words_from_string(s): 
    return (re.findall(re.compile('\w+'), s.lower())) 


def merge(seq): 
    merged = [] 
    for s in seq: 
     for x in s: 
      merged.append(x) 
    return merged 


fp1 = open('1.txt' , 'r'); 

set1 = set(line.strip() for line in fp1); 

l1 =[] 
for x in set1: 
    x.split() 
    x = get_words_from_string(x) 
    l1.append(x) 

l1= merge(l1); 

out = [] 
out = [[word , l1.count(word)] for word in l1 if (1 > out.count(word))] 

問題是它拋出異常,如果該單詞不在第一次出現 有沒有一種安全的方法來查找列表是否包含一個項目?

+1

請試着弄清楚爲什麼你認爲它不起作用,然後修改你的問題,包括你的發現。 – 2011-12-17 02:58:40

+1

當你運行這段代碼時會發生什麼,會發生什麼? – Blender 2011-12-17 03:00:34

回答

1

而且沒有進口的解決辦法是:現在

>>> f = open('1.txt', 'r') 
>>> words = f.read().split() 
>>> word_counter = {} 
>>> for word in words: 
... word_counter[word] = word_counter.get(word, 0) + 1 
... 
>>> word_counter 
{'a': 1, 'aba': 1, 'dd': 2, 'aaa': 1, 'ddd': 1} 

word_counterdict用的所有單詞的頻率的頻道。如果你想把它作爲列表的列表,你可以使用列表理解:

>>> word_counter_as_list = [ [k, v] for k, v in word_counter.items() ] 
>>> word_counter_as_list 
[['a', 1], ['aba', 1], ['dd', 2], ['aaa', 1], ['ddd', 1]] 
1

此行

out = [[word , l1.count(word)] for word in l1 if (not(-1<l1.index(word)))] 

說:「創建單詞列表/數列出了每個字,使得-1不小於字的索引l1」。但是-1總是小於l1中單詞的索引,因爲索引總是正數。所以這個過濾掉了所有的結果。

如果您刪除not,則按預期工作。但是,然後過濾器是完全沒有意義的。 index的結果總是大於-1,所以沒有任何過濾器。也就是說,除非word根本不在l1中,否則會引發異常!

更多關注你的代碼,你已經創建了一個荒謬的過於複雜的程序。有一個3線程序可以做你想做的事。你爲什麼要創建set行,然後迭代它們?你爲什麼使用正則表達式?這是一個非常簡單的問題,只是向您展示最佳方式,我感覺不對。但這裏有一些提示:

>>> fp1 = open('1.txt' , 'r'); 
>>> s = fp1.read() 
>>> s 
'a aba aaa\ndd ddd dd\n' 
>>> s.split() 
['a', 'aba', 'aaa', 'dd', 'ddd', 'dd'] 
>>> set(s.split()) 
set(['a', 'aba', 'dd', 'aaa', 'ddd']) 
2
from collections import Counter 

with open("1.txt") as f: 
    words = f.read().split() 

c = Counter(words) 

print [[word,count] for word, count in c.iteritems()] 
0
fp1 = open('1.txt' , 'r'); 
l1 = fp1.read(); 
    set1 = set(l1.split()); 
    for it in set1 : 
     print it, "count = " , l1.count(it); 
相關問題