在列表中计算初级单词:Python
处理一个非常常见的问题,以确定单词是否是初学者(所有字母按字母顺序排列)。正如“思考Python”中所发现的那样,我可以用多种方式来表达一个单词;但是,我希望能够遍历一个单词列表,确定哪些是初学者,并计算哪些是初学者在列表中计算初级单词:Python,python,list,Python,List,处理一个非常常见的问题,以确定单词是否是初学者(所有字母按字母顺序排列)。正如“思考Python”中所发现的那样,我可以用多种方式来表达一个单词;但是,我希望能够遍历一个单词列表,确定哪些是初学者,并计算哪些是初学者 def start(): lines= [] words= [] for line in open('word_test1.txt'): lines.append(line.strip()) numlines=len(lines)
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()
def start():
行=[]
单词=[]
对于打开的行('word_test1.txt'):
lines.append(line.strip())
numlines=len(行)
计数=0
对于第[:]行中的单词:
i=0
而我
我认为我的问题在于“whilei”循环中的“return”。在我使用的列表中,至少有三个初级单词。上面的代码读取前两个(这是第一个条目),打印它们,对它们进行计数,但在下面的非初学者单词上,会跳出循环并结束程序
我是编程新手,这花了我好几天的时间。我相信,当您发现字母的顺序不正确时,您打算
从while循环中断,而是发出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
第[:]行中的单词的:
尝试:
i=0
而我
您还可以尝试设置一个标志found
,然后稍后使用它来测试是否打印单词,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)
def是汉语(word):
i=0
而我
在本例中,中的return
语句是_abcedian()
只从该函数返回,然后由for
循环中的if
语句测试返回值
以这种方式拆分程序后,您还可以从其他地方使用is\u abcedian()
函数(在将来可能编写的相关代码中)。无需在此基础上进行低级编程:-)
用于浏览单词列表的用法:
>>> filter(is_abcedarian, ['apple', 'bee', 'amp', 'sun'])
['bee', 'amp']
稍微重组的方法:
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()
我喜欢Iterols:
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))
将c
更改为c我为您准备了此解决方案-我在与您相同的位置找到了它。我希望它仍然有用
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
def是初学者(word):
单词lower()
字母_值=0
对于大写字母:
如果ord(字母)<字母值:
返回错误
其他:
字母值=ord(字母)
返回真值
fin=打开('words.txt')
单词数量=0
对于fin中的行:
word=line.strip()
如果是初学者(单词):
单词数量=单词数量+1
打印字号
oneliner:filter(lambda s:list=sorted(s),['apple','bee','amp','sun'])
[w代表在['apple','bee','amp','sun']中的w,如果list(w)=sorted sorted(w)]
放弃所有使用索引进行迭代的过程,学习列表理解。你永远不会回头。
('fghi', 'klmn', 'abcd')
3
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