文件解析问题

4
我有一个关于作业问题的疑问。以下是问题:
编写一个程序,读取名为input.txt的文本文件,其中包含任意数量的形式为“城市, 国家”的行,然后使用字典记录这些信息,并最终输出屏幕上所表示国家的城市数列表。
例如,如果input.txt包含以下内容:
New York, US Angers, France Los Angeles, US Pau, France Dunkerque, France Mecca, Saudi Arabia
该程序将输出以下结果(以某种顺序):
Saudi Arabia : 1 US : 2 France : 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的调用。 - Jason LeBrun
是的,我知道这就是我的问题所在,但我想不出为什么它会计算两次。 - Ivan
看看你正在添加什么。你费尽心思准备了一个名为 word 的变量,但你实际上传递给函数的是什么? - Jason LeBrun
小问题,但是常见的问题(与您的问题无关),我也会犯这个错误...不要忘记关闭文件或使用“with”关键字让它为您关闭。假设这是项目的全部源代码。 - Mike Ramirez
3
或许 Sarah 能帮助你?她上周做了这个作业:http://stackoverflow.com/questions/5606127/python-file-parsing。 - johnsyweb
2个回答

2
processLine 函数中,你有一个多余的 for 循环。 wordlist 总是包含两个条目,城市和国家。 因此,在您的 for 循环内部的代码(包括 addword)将被执行两次 - 您可以完全删除 for 语句,它应该按照您的期望工作。

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)

希望我回答了您的问题


{'法国': 3, '沙特阿拉伯': 1, '美国': 2, '昂热': 1, '敦刻尔克': 1, '洛杉矶': 1, '麦加': 1, '纽约': 1, '波城': 1} - Yayati Sule

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接