2015-07-13 2 views
4

У меня есть назначение на python (2.7), которое просит меня получить вывод для строки. В 4-х вопросе предлагается указать букву алфавита, которая была раньше. Этот тест содержит только первый символ каждого слова предложения. Пример: «это предложение», результат должен быть «а», поскольку это первая буква алфавита.Неверный вывод в петле строки python

Вот мой код (в том числе и на предыдущие вопросы о переуступке)

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

Строки всегда строчные и все альфа-символы? –

+0

@PadraicCunningham: Не забывайте про пробелы. :) Похоже, что sylvain использует Python 2, так как они упоминают «raw_input» в комментарии, поэтому я думаю, мы можем смело предположить, что строки - это строки байтов, а не Unicode. OTOH, они _might_ содержат акцентированные буквы ... –

+1

Кстати, в Python принято писать простые имена переменных во всех строчных строчках. Имена, начинающиеся с буквы верхнего регистра, обычно используются для классов. Выделение синтаксиса переполнения стека отображает имена классов в голубых тонах, поэтому ваш сценарий выглядит немного странным и раздражает ветеранов Python. –

ответ

2

Если вы не можете использовать любые методы StR и может использовать только время цикла, 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' 

Единственный крайний случай будет строка, в которой не было ни одного письма, потом самое низкое будет }, чтобы вы могли решить, что должно произойти в этом случае.

+0

Ум, почему вы передаете 's' в качестве параметра и получаете его с помощью' raw_input'? –

+0

@ PM2Ring, просто проходил строку, чтобы проверить, показывают ли вывод, забыл удалить s –

+0

Rightio. Исходя из своего примера кода, я хочу, чтобы OP фактически передавал '' 'в качестве параметра, а не вызывал' raw_input' внутри функции. Кроме того, ваш код сработает, если предложение закончится пробелом, так как 's [i + 1]' поднимет 'IndexError'. Но я думаю, что этого не произойдет с ограниченными входными данными, которые они используют ... –

6

Я думаю, вы, возможно, слишком импонируете.

>>> s = "this is a sentence" 
>>> min(c for c in s if c.isalpha()) 
'a' 
+0

ha, извините, я забыл сказать, что я не могу использовать какие-либо библиотеки для задания. Только «вход» «raw_input» и «len» –

+3

нет внешней библиотеки, min и isalpha встроены в функцию/метод. –

+0

Цель состоит в том, чтобы заставить нас учиться нелегко, но он не уточнил для isalpha. он сказал нам, что мы должны сравнить каждый первый символ каждого слова предложения. Каждый раз, заменяя минимальный символ, если предыдущий сравнивается. –

Смежные вопросы