我刚开始学Python,所以我的问题可能有点傻。我正在尝试创建一个程序:
-导入文本文件(已获取)
-计算单词总数(得到它),
-从特定短语(例如“P1”,以另一参与者“P2”结尾)开始计算特定段落中的单词数,并将这些单词从我的单词数中排除。不知怎的,我最终得到了一些计算字符数的东西:/
-单独打印段落(明白)
-从我的字数中排除“P1”“P2”等单词。
我的文本文件如下:
P1:Bla-Bla-Bla。
第2页:废话废话。
P1:布拉布拉。
P3:布拉。
我最终得到了这个密码:
text = open (r'C:/data.txt', 'r')
lines = list(text)
text.close()
words_all = 0
for line in lines:
words_all = words_all + len(line.split())
print 'Total words: ', words_all
words_par = 0
for words_par in lines:
if words_par.startswith("P1" or "P2" or "P3") & words_par.endswith("P1" or "P2" or "P3"):
words_par = line.split()
print len(words_par)
print words_par.replace('P1', '') #doesn't display it but still counts
else:
print 'No words'
有什么改进的办法吗?
谢谢
第一部分是好的,你可以得到总单词和打印结果。
你摔倒的地方在这里
单词最初是一个包含文件行的字符串。在一个永远无法满足的条件下,它被变成一个
表达。如果这个表达式
如果要返回True,将始终拆分文件中的最后一行,因为最后一次分配给它是在程序的第一部分中,在该部分中,您对文件中的字数进行了完全计数。那真的应该是
同时
永远都是
自从
始终计算为第一个为True的字符串,这是本例中的第一个字符串。如果你想知道更多,请阅读http://docs.python.org/reference/expressions.html。
当我们在做的时候,除非你想做逐位比较,否则不要做
相反地
无论第一个表达式的结果如何,第一个表达式都将对两个表达式求值,而第二个表达式仅在第一个表达式为真时才求值。如果您这样做,您的代码将更有效地运行。
那个
下一行总是要计算行中的字符数,因为if语句的值总是为False,而单词_par从未被拆分成单词列表。
此外,无论序列是否为空,for循环上的else子句都将始终执行。有关详细信息,请查看http://docs.python.org/reference/compound_stmts.html#the-for-statement。
我写了一个版本的我认为你是作为一个例子,根据我认为你想要的。我尽量保持简单,避免使用诸如列表理解之类的东西,因为你说你刚刚开始学习,所以这不是最佳的,但希望会很清楚。另外请注意,我没有发表任何评论,所以请随意麻烦我为您解释。
编辑:
实际上,我刚刚注意到示例中有一些冗余代码。不需要变量para_count,因为单词将被附加到段落变量中。所以不是
你可以这样做
要跟踪的变量少了一个。这是更正后的片段。
第一部分是好的,你可以得到总单词和打印结果。
你摔倒的地方在这里
单词最初是一个包含文件行的字符串。在一个永远无法满足的条件下,它被变成一个
表达。如果这个表达式
如果要返回True,将始终拆分文件中的最后一行,因为最后一次分配给它的时间是在程序的第一部分,在该部分中,您对文件中的字数进行了完全计数。那真的应该是
同时
永远都是
自从
始终计算为第一个为True的字符串,这是本例中的第一个字符串。如果你想知道更多,请阅读http://docs.python.org/reference/expressions.html。
当我们在做的时候,除非你想做逐位比较,否则不要做
相反地
无论第一个表达式的结果如何,第一个表达式都将对两个表达式求值,而第二个表达式仅在第一个表达式为真时才求值。如果您这样做,您的代码将更有效地运行。
那个
下一行总是要计算行中的字符数,因为if语句的值总是为False,而单词_par从未被拆分成单词列表。
此外,无论序列是否为空,for循环上的else子句都将始终执行。有关详细信息,请查看http://docs.python.org/reference/compound_stmts.html#the-for-statement。
我写了一个版本的我认为你是作为一个例子,根据我认为你想要的。我尽量保持简单,避免使用诸如列表理解之类的东西,因为你说你刚刚开始学习,所以这不是最佳的,但希望会很清楚。另外请注意,我没有发表任何评论,所以请随意麻烦我为您解释。
编辑:
实际上,我刚刚注意到示例中有一些冗余代码。不需要变量para_count,因为单词将被附加到段落变量中。所以不是
你可以这样做
要跟踪的变量少了一个。这是更正后的片段。
也许我不完全理解这些要求,但我会尽力的。
第一部分是所有单词的计数。我会把它缩短一点:
在第二部分,似乎出了点问题。
更多问题:
"P1" or "P2" or "P3"
计算结果为"P1"
(非空字符串是“truthy”值)。所以你可以把线缩短到这可能不是你想要的。
当条件的计算结果为False时,不会调用split方法,
words_par
仍然是一个字符串(不是预期的字符串列表)。因此len(words_par)
返回字符数而不是单词数。(名称上有点不一致:我知道这个错误是由于变量命名不准确引起的。不同的名字
会产生一个清晰的错误信息。在第二次阅读中,这一定是你的意思。)
您不应该使用标识符文本调用
open ('zery.txt', 'r')
。它不是文件中的文本,而是文件的处理程序,在文档中被描述为“类文件对象”(顺便说一句,我从来都不明白它的意思是“类文件对象”)是的。
比
是的。
您应该阅读有关split()的说明,这样您就可以:
是的。
如果文本的结构是:
然后
words_par.endswith("P1" or "P2" or "P3")
总是False,因此不会执行所需的拆分。因此,words_par不会成为一个列表,它仍然是一个字符串,这就是计算字符的原因。
是的。
而且,你的代码肯定是错的。
如果执行了拆分,它将是在第一个for循环中获得的最后一个行,在代码的开头,它将被重复拆分。
所以,代替
当然是:
相关问题 更多 >
编程相关推荐