2014-01-18 36 views
0

我有一句話「快狐跳過懶狗」,我已經統計了這個句子中每個單詞出現的次數。輸出應該是這樣的:打印單詞的頻率,用單句排成一行

brown:1,dog:1,fox:1,jumps:1,lazy:1,over:1,quick:1,the:2 

應該有這種輸出的字符之間沒有空格,且應該有字/數字之間的逗號。 從我的程序的輸出是這樣的:

,brown:1,dog:1,fox:1,jumps:1,lazy:1,over:1,quick:1,the:2 

我發現,有前「棕色」逗號地方。有沒有更簡單的方法來打印這個?

filename = os.path.basename(path) 


    with open(filename, 'r+') as f: 
     fline = f.read()  
     fwords = fline.split() 

     allwords = [word.lower() for word in fwords] 
     sortwords = list(set(allwords)) 


    r = sorted(sortwords, key=str.lower) 

    finalwords = ','.join(r) 

    sys.stdout.write(str(finalwords)) 
    print '\n' 

    countlist = {} 
    for word in allwords: 
     try: countlist[word] += 1 
     except KeyError: countlist[word] = 1  

    for c,num in sorted(countlist.items()): 
     sys.stdout.write(",{:}:{:}".format(c, num)) 

回答

1

一對夫婦交替製作單詞列表的方法。首先,一行:

countlist = {word:allwords.count(word) for word in allwords} 

正如DSM指出的那樣,該方法對於長列表來說可能會很慢。另一種辦法是使用defaultdict

from itertools import defaultdict 
countlist = defaultdict(int) 
for word in allwords: 
    countlist[word] += 1 

對於輸出,加入單詞計數與,,這避免了在開始一個:

sys.stdout.write(",".join(["{:}:{:}".format(key, value) for key, value in countlist .items()])) 
+0

的OP已經有一本字典單詞計數 - 'countlist',這是無可爭議的命名。 OP的計數方法是線性的,因此它會比'.count'更快。 – DSM

+0

@DSM,我知道OP有一個詞計數字典。這是一種替代方式,可能更容易(但是在很長的列表中肯定會變慢)的方式。我想我會添加一個使用'defaultdict'的例子。 – mhlester