计算列表中的初学者词:Python

时间:2012-04-01 19:11:24

标签: python list

处理一个非常常见的问题,以确定单词是否为初学者(所有字母均按字母顺序排列)。我可以用“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”。在我正在使用的列表中,至少有三个初学者的话。上面的代码读取前两个(它们是第一个条目),打印它们,计算它们但是在下面的非初始化单词中突破循环并结束程序。

我是编程新手,这花了我几个小时的时间。

6 个答案:

答案 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