请建议更多的技巧.I/O和序列.

您想建议我对以下代码有任何改进吗? 我想让我的实施像python一样简单 - 本地人,就像 可能的. 我编写了简单的代码,该代码读取输入文本文件并创建单词' 按外观数量排名. 代码: ------------------------------------------------------------------------------------ --------------------------------------- 导入系统 def morecommonword(x,y): 如果x [1]!= y [1]: 返回CMP(X [1],Y [1]) * -1 返回cmp(x [0],y [0]) wordsdic = {} infile = open(sys.argv [1]) 对于infile.read().split()中的单词: 如果wordsdic.has_key(word): worddic [word] = worddic [word] + 1 别的: worddic [word] = 1 infile.close() wordslst = worddic.items() wordslst.sort(morecommonword) OUTFILE = open(sys.argv [2],'w') 在wordslst中的一对: OUTFILE.WRITE(str(PAIR [1]).rjust(7) +":" + str(Pair [0]) +" \ n") outfile.close() ------------------------------------------------------------------------------------ --------------------------------------- 特别是,我不喜欢读全文件只是为了拆分它. 这很容易按线条阅读 - 我可以轻松地用文字阅读吗? PS我从今天早上开始学习Python,所以请理解:> - - 问候, Piotrek

# 回答1

Qertoip写道: 在Python 2.2之前(因为我们为单词使用不同的数据): 对于单词,频率: 打印>> OUTFILE,'%7D:%s'%(频率,单词) Python 2.2之后: 对于否定性,单词中的单词: 打印>> OUTFILE,'%7D:%s'%(-negfrequency,word) 因此,有了我所有的偏见,我的盒子里有Python 2.4,我会 提起一些功能: def重新数(语料库,流动): ''''更新语料库在语料库中从infile in Infile''''''' 对于infile中的线: 对于line.split(): 尝试: 语料库[word] += 1 除了KeyError: 语料库[word] = 1 def main(来源,输出= none): '''计算源中的单词并报告频率以输出'''''' 语料库= {} 来源中的来源: F =开放(源) 重新数(语料库,F) f.close() 对于否定性,分类中的单词( - ( - 频率,单词) 词语,corpus.iteritems()): 打印>>输出,'%7D:%s'%(-negfrequency,word) 如果__name__ =='__ main __': 导入系统 如果Len(sys.argv)<2: main(sys.argv [1:]) 别的: 输出= open(sys.argv [-1],'w') 尝试: main(sys.argv [1:-1],输出) 最后: output.close() - 斯科特·戴维·丹尼尔斯(Scott David Daniels) DNIA星期五,2005年3月25日12:51:59 -0800,Scott David DanielsNapisa³(A): 感谢您的回复! 这真的很有启发. 好的,在这里,我将获得特定版本的特定版本. 对于python 2.4和更高版本:words = sorted(( - freq,word)for Word,corpus.iteritems()中的freq) 这是我最喜欢的! :)您设法避免了MoreCommonWord() 巧妙地使用列表综合和序列Comaparison规则. python 2.2之后:对于否定性,单词中的单词:打印>> oftfile,'%7d:%s'%(-negfrequency,word) 这也很酷,我不知道这种"打印"用法. 因此,在我的所有偏见和我的盒子上有Python 2.4的情况下,我会把一些事情提升到功能: 虽然我喜欢 e您的功能和可重复性改进,我会坚持 对于我的可简单性解决方案,给定的要求(我没有 提及,例如假设正确的命令行参数). 因此,当前代码是: ------------------------------------------------------------------------------------ --------------------------------- 导入系统 语料库= {} infile = open(sys.argv [1]) 对于infile中的线: 对于line.split(): 语料库[word] = colpus.setDefault(word,0) + 1 infile.close() 单词= sorted(((-freq,word)for Word,colpus.iteritems())中的freq OUTFILE = open(sys.argv [2],'w') 对于negfreq,单词中的单词: 打印>> OUTFILE,'%7D:%s'%(-negfreq,word) outfile.close() ------------------------------------------------------------------------------------ --------------------------------- 有什么想法使它变得更好吗? :> - - 问候, Piotrek
# 回答2

您可能会利用.get方法 重写字典: wordsdic = {} infile = open(sys.argv [1]) 对于infile.read().split()中的单词: 如果wordsdic.has_key(word): worddic [word] = worddic [word] + 1 别的: worddic [word] = 1 作为: wordsdic = {} infile = open(sys.argv [1]) 对于infile.read().split()中的单词: worddict [word] = worddict.get(word,0)+1 并利用元组扩展和百分比格式 在wordslst中的一对: OUTFILE.WRITE(str(PAIR [1]).rjust(7) +":" + str(Pair [0]) +" \ n") 作为 对于单词,在wordslst中计数: outfile.write("%7s:%i \ n"%(word,count)) 我想你以为你所有的单词都少于7个字符( 我复制了). 但是我敢肯定还有许多其他"好"方法. 拉里·贝茨(Larry Bates) Qertoip写道:( _@_) Qertoip写道:以上是(可能)当异常时(对于任何新词)而言,这是(可能). 但是,我刚刚阅读了以下内容:copus [word] = colpus.setDefault(word,0) + 1 这对诸如: colpus.setDefault(word,[]).附录(...) 您可能更喜欢: 语料库[word] = copus.get(word,0) + 1 权衡取决于您的测试材料的大小. 你需要 用您的单词混合来计时. 我在想曲柄 通过大量的文本(因此频率1的单词是迄今为止的 少数案件). 如果您经历了莎士比亚的第一个作品集, 只需进行计数部分,try-except和.get案例是 难以区分(每个2.0秒)和.setDefault版本 拖入缓慢的2.2秒. 只是经过Anna Karenina, 再次.83,.83和.91. 因此,.setDefault表格慢10%. 对于出色的测试用例(以及您自己的个人教育) 访问Gutenberg项目. 当您进行计时时要当心:文件是否"温暖"可以 有很大的变化. 在计时之前,请阅读一次. - 斯科特·戴维·丹尼尔斯(Scott David Daniels) DNIA星期五,2005年3月25日19:17:30 +0100,QertoipNapisa³(A): 我的好朋友听说过我创造紧凑,简单的python的尝试 脚本并撰写以下PHP脚本: ----------------------------------------------------------------------------- ---------------------------------------- $ data = join('',file($ argv [1])); foreach(爆炸('',$ data)为$ slopo) $ stat [chop($ slowo)] ++; array_multisort($ stat,sort_desc,array_keys($ stat)); foreach($ stat as $ sl => $ il) $ odata.=" $ il:$ sl \ n"; file_put_contents($ argv [2],$ odata); ------------------------------------------------------------------------------------ ----------------------------------- ....具有相同的功能,而实际代码线较少[7]. 我有点困惑,因为我认为Python更具表现力 php. 我现在对改进实施的兴趣越感兴趣:) 看起来这个[11个实际代码线]: ------------------------------------------------------------------------------------ ----------------------------------- 导入系统 语料库= {} infile = open(sys.argv [1]) 对于infile.read().split()中的单词: 语料库[word] = copus.get(word,0) + 1 infile.close() 单词= sorted(((-freq,word)for Word,colpus.iteritems())中的freq OUTFILE = open(sys.argv [2],'w') 对于negfreq,单词中的单词: outfile.write('%7d:%s \ n'%(-negfreq,word)) outfile.close() ------------------------------------------------------------------------------------ ----------------------------------- PS THX 2 Scott David Daniels和Lary Bates - - 问候, Piotrek
# 回答3

Qertoip写道: [SNIP 11线Python] 如果您想要更少的线条,那就不太难了. 注意 如果有人对此有问题,我 仅指向不可读的线噪声 PHP脚本作为证据,表明这与 风格但简洁: ------------------------------------ 导入系统 语料库= {} 对于open中的单词(sys.argv [1]).read().split(): 语料库[word] = copus.get(word,0) + 1 单词=反向(分类(data [::-1]用于colpus.iteritems()中的数据)))) 打开(sys.argv [2],'w').writelines('%7d:%s \ n'%数据的数据数据) ------------------------------------ 我很好奇这个还是PHP做的 但是,想要. 以上没有在"单词"上分开,但是 仅在空格上,使结果毫无意义 如果您担心标点符号等. -peter
# 回答4

DNIA星期五,2005年3月25日21:09:41 -0500,彼得·汉森·纳皮萨(A): 感谢您的评论! :) [SNIP 11线Python] --------------------------------导入sys copus = {} for open(sys.argv [1])中的单词. ():corpus [word] = corpus.get(word,0) + 1个单词= reversed(sorted(data [::-1])colpus.iteritems()))open(sys.argv [2], 'w').writelines('%7D:%s \ n'%数据中的数据数据)------------------------------------------------------------------------------------------------ 文件是否在两种情况下都自动关闭? 但是,我很好奇这个或PHP是否可以做真正想要的事情. 以上不是在"单词"上划分的,而只是在空格上,如果您担心标点符号等,则结果毫无意义. 您是完全正确的,但要求是故意的 简化,确保0-纠正输入,并允许诸如"嘿,!1_go"之类的单词 我的目的是使我的实施尽可能简洁,但 *钢是自然,可读和清晰的*. - - pozdr. Piotrek
# 回答5

Qertoip写道:是 文件在两种情况下都会自动关闭? 是的. 文件对象不再有 引用它(带有cpython)或 申请终止或垃圾收集 执行回收对象(Jython,Ironpython, 以及其他不使用参考的python 数数). 无论哪种方式,对于一个小脚本,这都是安全的. -peter

标签: python

添加新评论