2011-04-14 77 views
4

我對我的作業問題有疑問。問題如下: 編寫一個程序,它讀取一個名爲input.txt的文本文件,其中包含任意數量的格式爲「,」的行,然後使用字典記錄此信息,最後將屏幕上顯示的國家/地區列表在文件中包含的城市數量。文件解析問題

例如,如果input.txt中包含以下內容:

紐約,美國
法國昂熱
洛杉磯,美國
加索爾,法國
敦刻爾克,法國
沙特阿拉伯麥加

該程序會輸出以下內容(按某種順序):

沙特阿拉伯:1
美國:2
法國:3

這裏是我的代碼:

def addword(w,wcDict): 
    if w in wcDict: 
     wcDict[w] +=1 
    else: 
     wcDict[w]= 1 

import string 
def processLine(line, wcDict): 
    wordlist= line.strip().split(",") 
    for word in wordlist: 
     word= word.lower().strip() 
     word=word.strip(string.punctuation) 
     addword(wordlist[1], wcDict) 

def prettyprint(wcDict): 
    valkeylist= [(val,key) for key,val in wcDict.items()] 
    valkeylist.sort(reverse = True) 
    for val,key in valkeylist: 
     print '%-12s %3d'%(key,val) 

def main(): 
    wcDict={} 
    fobj= open('prob1.txt','r') 
    for line in fobj: 
     processLine(line, wcDict) 
    prettyprint (wcDict) 

main() 

我的代碼計算每個國家的兩倍。你能幫我麼?

謝謝

+1

這裏有一個提示:看你在'processLine'函數調用'addword'。 – 2011-04-14 02:58:36

+0

是的,我知道這是我的問題所在,但我無法弄清楚它爲什麼會計算兩次。 – Ivan 2011-04-14 03:11:41

+0

看看你在添加什麼。你經歷了所有的麻煩準備了一個名爲'word'的變量,但是你真正傳遞給函數的是什麼? – 2011-04-14 03:14:08

回答

2

processLine功能,你有外來的for循環。 wordlist將始終包含兩個條目,即城市和國家/地區。因此,for循環中的代碼(包括addword)將被執行兩次 - 您可以完全刪除for語句,它應該按照您的預期工作。

+0

謝謝。現在我明白了。 – Ivan 2011-04-14 03:18:10

+0

我感謝幫助 – Ivan 2011-04-14 03:19:16

0
from collections import Counter as c 
lines = (line.strip() for line in open("file.txt")) 
data = (elem for elem in lines) 
result = [two for one in data for two in one.split(",")] 
c = Counter() 
c(result) 

我希望我回答您的查詢

+0

{ '法國 ':3, ' 沙特 ':1, ' 美':2, '昂熱':1, '敦刻爾克':1, '洛杉磯':1, 'Mecca':1, 'New York':1, 'Pau':1} 這是我的結果.. – 2017-08-02 11:31:08