Python字符串循环中输出错误

4

我有一个关于Python(2.7)的任务,要求我输出一个字符串。在第4个问题中,要求给出字母表中先出现的字母。这只测试每个单词的第一个字符。示例:“this is a sentence”结果应为“a”,因为它是字母表中的第一个字母。

以下是我的代码(包括前几个问题)

def GetNumWords ( Sentence ):
    Count = 0
    Length = len( Sentence )
    Index = 0
    while Index < Length:
        Char = Sentence [ Index ]
        if Char != ' ':
            Count += 1
            while Char != ' ' and Index < Length:
                Char = Sentence [ Index ]
                Index += 1
        else:
            Index += 1
    return Count

def GetWordNum ( Sentence, WordNum ):
    Count = 0
    Length = len( Sentence )
    Index = 0
    Word = ''   
    while Index < Length:
        Char = Sentence [ Index ]
        if Char != ' ':
            Count += 1
            while Char != ' ' and Index < Length:
                Char = Sentence [ Index ]
                Index += 1
                if Count == WordNum:
                    Word = Word + Char
        else:
            Index += 1
    if Word == '':
        return ''
    else:
        return Word

def GetFirstLetter ( Sentence, SpecificNum):
    TheWord = GetWordNum ( Sentence, SpecificNum )
    if TheWord == '':
        return ''
    else:
        FirstLetter = TheWord [ 0 ]
        return FirstLetter

def GetEarliestLetter ( Sentence ):
    CurrentMinNum = 1
    CurrentMin = GetFirstLetter ( Sentence, CurrentMinNum )
    LastWord = GetNumWords ( Sentence )
    if CurrentMin == '':
        return ''
    else:
        while CurrentMinNum <=  LastWord:
            FirstLetter = CurrentMin
            if FirstLetter < CurrentMin:
                CurrentMin = FirstLetter
                CurrentMinNum += 1
            else:
                break
        return CurrentMin

这样做可以获得句子中第一个单词的第一个字母,而不是字母表顺序中最早的字母。

我错在哪里了?我已经查看了过去两天,但是我看不出我错在哪里。


2
字符串是否总是小写且只包含字母字符? - Padraic Cunningham
1
顺便提一下,在Python中,惯例是使用全小写字母编写普通变量名称。以大写字母开头的名称通常用于类。堆栈溢出语法突出显示青色类名,因此您的脚本看起来可能会让Python老手感到奇怪和刺眼。 - PM 2Ring
1
@sylvainpissardmaillet,输入和情况对于问题的解决非常重要,如果您始终使用小写字母,则可以通过循环轻松解决。 - Padraic Cunningham
1
告诉你的讲师阅读PEP0008。 - SiHa
@PadraicCunningham,他没有明确说明。如果我能够同时使用小写和大写字母,那将是一个加分项。但我认为只用小写字母就可以了。在他的示例中,他只使用了小写字母。 - sylvain pissard maillet
显示剩余4条评论
2个回答

6
我认为你可能过于复杂化了它。
>>> s = "this is a sentence"
>>> min(c for c in s if c.isalpha())
'a'

哈,抱歉我忘了说我不能在作业中使用任何库。只能使用 "input"、"raw_input" 和 "len"。 - sylvain pissard maillet
3
没有外部库,min和isalpha是内置函数/方法。 - Dor-Ron
目标是让我们通过艰难的方式学习,但他没有明确说明isalpha。他告诉我们应该比较句子中每个单词的第一个字符。每次如果比较的字符在前面,则替换最小的字符。 - sylvain pissard maillet
3
如果该程序仅测试每个单词的第一个字符,则您需要在问题中明确说明这一点。 - PM 2Ring
我在论坛上的开端不太顺利。是的,我的当前问题是找到字母表中最早的字符。只使用每个单词的第一个字符。 - sylvain pissard maillet

2

如果你不能使用任何字符串方法,只能使用while循环、raw_input和len,那么你的输入必须受到限制,所以这将找到每个单词中最低的第一个字母:

def first_alpha():
    s = raw_input()
    mn, curr = s[0], s[0]
    i = 1
    while i < len(s):
        if s[i] == " ":
            if curr < mn:
                mn = curr
            curr = s[i+1]
        i += 1
    return mn if curr > mn else curr

正如我所说,这仅适用于受限制的输入,其中仅包括单词和用单个空格分隔的单词。

In [5]: first_alpha()
this is a sentence
Out[5]: 'a'    
In [6]: first_alpha()
lowest char is trailing a
Out[6]: 'a'    
In [7]: first_alpha()
lowest char is upper A
Out[7]: 'A'

显然,如果没有限制,min(word[0] for word in s.split()) 是一个更简单的方法。
为了仅匹配非字母字符和结尾处的空格,请使用以下代码:
def first_alpha():
    s = raw_input()
    # ord("{") == 123
    mn, curr = "{", "{"
    i = 0
    # catch line ending in a space
    ln = len(s) if s[-1] != " " else len(s) - 1
    while i < ln:
        if s[i] == " ": 
            if curr <= mn:
                mn = curr
            ch = s[i+1]
            # make sure we have a letter
            if "a" <= ch <= "z" or "A" <= ch <= "Z":
                curr = ch
        i += 1
    return mn if curr > mn else curr

输出:

In [29]: first_alpha()
this is sentence where the lowest is ! but we return a
Out[29]: 'a'
In [30]: first_alpha()
lots of   spaces and    but we return a     
Out[30]: 'a'

唯一的特殊情况是一个字符串中没有任何字母,那么最小值将是},这种情况下您可以决定应该发生什么。

@PM2Ring,是的,我假设输入将以特定格式呈现,您可以捕获所有非字母和尾随或多个空格,我可能会添加一个执行此操作的函数。 - Padraic Cunningham
我意识到老师们制造这些人为限制是为了创造学习练习,但是它们可能会导致丑陋的非Pythonic代码。像这样做应该被归类为残忍和不寻常的惩罚。 :) - PM 2Ring
@PadraicCunningham,我尝试了你的答案,你定义的第一个函数仍然给出了句子中出现的最早字母而不是字母表中的字母。 - sylvain pissard maillet
@PM2Ring,确实,Python有点被滥用,但我想这都是为了教育的名义! - Padraic Cunningham
@sylvainpissardmaillet,不,如果您喜欢,可以将其分成两行,第二个函数更加健壮,适用于任何输入。 - Padraic Cunningham
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接