from itertools import groupby
import urllib
def find_three_double(words_file):
for word in words_file:
word = word.strip()
if sum(sum(1 for i in g) == 2 for k,g in groupby(word)) == 3:
print word
# Access the file containing the valid letters
words_url = "http://thinkpython.com/code/words.txt"
words_file = urllib.urlopen(words_url)
# Apply the actual test
find_three_double(words_file)
说明:
在生成器表达式中,我们看到groupby(word)。这将扫描单词并将两个字母聚集在一起。在
sum(1 for i in g)应用于每个组。它相当于求群的长度。如果长度为2,则这是一个双字母,因此sum(1 for i in g) == 2的计算结果为True
^{} 可以大大简化您的程序(=更少的错误)
说明:
在生成器表达式中,我们看到
groupby(word)
。这将扫描单词并将两个字母聚集在一起。在sum(1 for i in g)
应用于每个组。它相当于求群的长度。如果长度为2,则这是一个双字母,因此sum(1 for i in g) == 2
的计算结果为True
外部的}的值相加,}则被添加为
sum()
将所有的True
和{True
被添加为1
,而{0
。如果正好有3个True
值,则会打印该单词如果您的第一个检查(
s[i] == s[i+1]
)是True
,那么您将永远不会递增i
,这样循环将永远继续。在一开始我没有仔细阅读您的代码,结果发现它与}无关,因为您正在迭代
read()
或{find_three_doubles()
函数。在在您的
three_double()
函数中:有两个问题:
i
递增1,否则如果存在“double”,while循环将永远不会停止。在elif
更改为if
,否则将不会选择某些限定词。在固定代码:
^{pr2}$结果:
相关问题 更多 >
编程相关推荐