处理一个非常常见的问题,以确定单词是否为初学者(所有字母均按字母顺序排列)。我可以用“Think Python”中的几种方式做一个单词;但是,希望能够遍历一个单词列表,确定哪些是初学者并计算那些是初学者。
def start():
lines= []
words= []
for line in open('word_test1.txt'):
lines.append(line.strip())
numlines=len(lines)
count = 0
for word in lines[:]:
i = 0
while i < len(word)-1:
if word[i+1] < word[i]:
return
i = i+1
print (word)
count= count + 1
print (count)
start()
我认为我的问题在于“while i”循环中的“return”。在我正在使用的列表中,至少有三个初学者的话。上面的代码读取前两个(它们是第一个条目),打印它们,计算它们但是在下面的非初始化单词中突破循环并结束程序。
我是编程新手,这花了我几个小时的时间。
答案 0 :(得分:11)
不需要对此进行低级编程: - )
def is_abcedarian(s):
'Determine whether the characters are in alphabetical order'
return list(s) == sorted(s)
使用filter来运行单词列表:
>>> filter(is_abcedarian, ['apple', 'bee', 'amp', 'sun'])
['bee', 'amp']
答案 1 :(得分:3)
return
语句突破了整个 start()
函数。有许多可能的方法可以解决这个问题,但最明显的可能是将代码分成两个函数:
def is_abcedarian(word):
i = 0
while i < len(word)-1:
if word[i+1] < word[i]:
return False
i = i+1
return True
def start():
lines= []
words= []
for line in open('word_test1.txt'):
lines.append(line.strip())
numlines=len(lines)
count = 0
for word in lines[:]:
if is_abcedearian(word):
print (word)
count= count + 1
print (count)
在此示例中,return
中的is_abcedarian()
语句仅从那个函数返回,然后返回值由if
语句中的for
语句进行测试。 is_abcedarian()
循环。
一旦你以这种方式拆分你的程序,你就可以使用其他地方的{{1}}函数(在你可能编写的未来相关代码中)。
答案 2 :(得分:1)
我相信当你发现字母不符合时,你打算从while循环中break
,而你发出return
语句,它会从函数start
返回。
可能有几种方法可以做到这一点
您可以使用Exception来引发StopIteration异常并在while循环之外捕获它。
for word in lines[:]:
try:
i = 0
while i < len(word)-1:
if word[i+1] < word[i]:
raise StopIteration
i = i+1
print (word)
except StopIteration:
None
您也可以尝试设置标记found
,然后再使用它来测试打印单词
答案 3 :(得分:0)
略微重组的方法:
def is_abcedarian(word):
return sorted(s)==list(s)
def main():
# read input file
with open('word_test1.txt') as inf:
words = [line.strip() for line in inf]
# figure out which words are "good"
good_words = [word for word in words if is_abcedarian(word)]
# print the "good" words
print("\n".join(good_words))
print(len(good_words))
if __name__=="__main__":
main()
答案 4 :(得分:0)
我喜欢iterools:
from itertools import tee, izip
def pairwise(iterable):
a, b = tee(iterable)
next(b)
return izip(a, b)
def is_abcdarien(word):
return all(c < d for c, d in pairwise(word))
words = 'asdf', 'qwer', 'fghi', 'klmn', 'aabcd', 'abcd'
print filter(is_abcdarien, words)
print len(filter(is_abcdarien, words))
结果:
('fghi', 'klmn', 'abcd')
3
如果您想要非严格的排序,请将c < d
更改为c <= d
,以便“aabcd”也是abcdarian,。
答案 5 :(得分:0)
我有这个解决方案 - 我发现它和你在同一个地方。我希望它仍有帮助。
def is_abecedarian(word):
word.lower()
letter_value=0
for letter in word:
if ord(letter) < letter_value:
return False
else:
letter_value = ord(letter)
return True
fin = open('words.txt')
words_no = 0
for line in fin:
word = line.strip()
if is_abecedarian(word):
words_no = words_no + 1
print words_no