在列表中计算初级单词: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)

处理一个非常常见的问题,以确定单词是否是初学者(所有字母按字母顺序排列)。正如“思考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()
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