我开始学习Python,并试图编写一个程序来导入一个文本文件,计算总字数,计算特定段落中的字数(由每个参与者说,用'P1'、'P2'等描述),从字数中排除这些字词(例如'P1'等),并分别打印段落。在
多亏了@James Hurford我得到了这个代码:
words = None
with open('data.txt') as f:
words = f.read().split()
total_words = len(words)
print 'Total words:', total_words
in_para = False
para_type = None
paragraph = list()
for word in words:
if ('P1' in word or
'P2' in word or
'P3' in word ):
if in_para == False:
in_para = True
para_type = word
else:
print 'Words in paragraph', para_type, ':', len(paragraph)
print ' '.join(paragraph)
del paragraph[:]
para_type = word
else:
paragraph.append(word)
else:
if in_para == True:
print 'Words in last paragraph', para_type, ':', len(paragraph)
print ' '.join(paragraph)
else:
print 'No words'
我的文本文件如下所示:
P1: Bla bla bla.
P2: Bla bla bla bla.
P1: Bla bla.
P3: Bla.
下一步我要做的是总结每个参与者的单词。我只能打印,但我不知道如何归还/再利用它们。在
我需要一个新的变量,其中包含每个参与者的单词数,我可以在以后操作它,此外还可以总结每个参与者所说的单词,例如
^{pr2}$有没有办法把“你”或“它”等算作两个词?在
有什么办法解决吗?在
不,您需要一个^{} (Python2.7+,否则使用
defaultdict(int)
)将人员映射到字数。在现在,
words_per_person['P1']
包含P1
的字数,假设text.split()
是一个足够好的标记符。(语言学家不同意单词的定义,所以你总是会得到一个近似值。)你可以用两个变量。一个用来记录某人在说什么,另一个用来记录讲话人的段落。为了存储段落并关联段落所属的人,请使用dict和person作为键,并使用与该键相关联的段落列表。在
从这里你可以总结出这样说的字数
^{pr2}$恭喜你用Python开始你的冒险之旅!并不是这篇文章中的所有内容现在都有意义,但请将其添加到书签中,如果以后有帮助的话,可以回来看看。最终你应该尝试从脚本到软件工程,这里有一些想法给你!在
强大的力量带来了巨大的责任感,作为Python开发人员,您需要比其他语言更严格地约束自己,因为这些语言不支持您的工作,并实施“好”的设计。在
我发现从自上而下的设计开始是有帮助的。在
轰!你刚刚写了整个程序,现在你只需要回来填空!当你这样做的时候,它似乎没有那么吓人。就我个人而言,我认为自己不够聪明,不能解决很大的问题,但我擅长解决小问题。所以让我们一次解决一件事。我将从“处理文本”开始。在
^{pr2}$我还不太清楚这些东西意味着什么,但我知道文本问题往往遵循一种叫做“map/reduce”的模式,这意味着您对某个东西执行和操作,然后将其清理并合并,所以我添加了一些占位符函数。如果有必要的话,我可以回去再加一些。在
现在让我们写下“过程目录”。我本可以写“过程”的,但这听起来很蹩脚。在
很酷。还不错。你可能会和我不同,但我认为把项目汇总起来,每段数单词,然后数一数所有单词。在
因此,在这一点上,我可能会制作一个或两个小的“lib”(库)模块来填充剩余的函数。为了使您能够在不担心导入的情况下运行此程序,我将把它全部保存在一个.py文件中,但最终您将学会如何拆分这些文件,使其看起来更好。所以我们就这么做吧。在
a和一个小助手函数
所以它可能不明显,但这个库是作为一个数据处理管道设计的。数据处理有几种方法,一种是流水线处理,另一种是批处理。让我们来看看批处理。在
所有这些嵌套字典都变得有点复杂了。在实际的生产代码中,我会用一些更可读的类来替换它们(同时添加测试和docstring!!),但我不想让这件事比现在更令人困惑!好吧,为了您的方便,下面是整个事情的组合。在
因此,对于这个应用程序来说,这个脚本几乎肯定是大材小用了,但关键是要看看可读的、可维护的、模块化的Python代码可能是什么样子。在
可以肯定的是,输出如下:
相关问题 更多 >
编程相关推荐