2013-03-29 2 views
1

Прошу прощения, если мои вопросы кажутся тривиальными. Я бы попросил об этом в чате; тем не менее, моя репутация на данный момент слишком низкая, поэтому я не могу ничего спросить в чате Python. В настоящее время я изучаю Python для класса, и преподаватель дал нам некоторые практические проблемы для работы, чтобы заставить нас развернуться. Функция, которую я сейчас создаю, принимает список чисел и преобразует его в строку. Проблема, которую я испытываю, заключается в том, что мой оператор if никогда не оценивает true. Я пробовал несколько способов работать с переменными и добавил много операторов печати, чтобы увидеть, должны ли они когда-либо быть равными, но безрезультатно. Еще раз спасибо. Я обещаю, я только спрашиваю после исследования и попыток много способов, но теперь я в недоумении ... Вот мой код:Python If Statement никогда не оценивает до истины

def nlist2string(nlist): 
    characters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] 
    numbers = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25'] 
    newList = [] 
    nListLen = len(nlist)   # var msgLen will be an integer of the length 

    print 'Number list before conversion: ', nlist 

    index = 0 
    while index < nListLen: 
     print 'Index at: ', nlist[index] 
     num = nlist[index] 
     print 'Is num equal to nlist indexed? ', num 
     newNum = num % 26 

     i = 0 
     while i < 26: 
      num1 = newNum 
      num2 = numbers[i] 
      print 'num1 = ', num1 
      print 'num2 = ', num2 
      if (num1 == num2): 
       newList.append(characters[i]) 
       print 'Here is the current newList: ', newList 
      else: 
       print 'They never equal each other.' 
      i = i + 1 
     index = index + 1 
    return newList 

    numMessage = [28, 0, 33] 
    convertedNumMsg = nlist2string(numMessage) 
    print 'Number list after conversion: ', convertedNumMsg 
+0

При использовании 'def' заявление, отступа весь код внутри блока по крайней мере одним пробелом. Прямо сейчас вы определяете функцию по имени 'nlist2string', но вы не отступаете от кода, который следует. –

+0

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

ответ

5

Вы пытаетесь сравнивать целые числа в строки, попробуйте изменить определение для numbers в следующие:

numbers = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25] 

Или, альтернативно, numbers = range(26).

В настоящее время при сравнении num1 и num2, вы будете делать сравнение, как 4 == '4', который никогда не будет верно:

>>> 4 == '4' 
False 

В качестве альтернативы изменения, как вы создаете свой numbers список, вы можете конвертировать num2 в целое число или num1 до строки перед сравнением, поэтому либо num1 == int(num2), либо str(num1) == num2.

+1

В качестве альтернативы, 'num2 = int (числа [i])' –

+0

Несколько секунд спустя. Я удалю свой ответ. – Dilawar

+2

Гораздо лучший способ сделать этот список: 'range (26)' –

0

В Python строковые литералы и числа являются отдельными типами объектов и не сравниваются с равными.

1 == "1" 

возвращает False.

Вы повторяете свой список строк цифр, но это не список фактических чисел.

Вы можете использовать функцию range() (это встроенный python), чтобы генерировать список номеров вместо того, чтобы вводить его вручную.

1

У вас есть список строк, чисел 0-25.
В Python строка никогда не равна числу, поэтому num1 == num2 всегда False.

Таким образом, это должно быть

numbers = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25] 

является более подходящим (и будет работать).

Или еще лучше

numbers = range(26) 

И если вы не хотите, чтобы изменить значение numbers «s, используйте этот условный:

if num1 == int(num2): 

Это будет конвертировать num2 в целое число, это то, что вы хотите сделать.
Кроме того, в этом случае, вы можете использовать map (Built-in Function), для более читабельностей так:

numbers = map(str, range(26)) 
1

Ответ выше правильно отвечает на вопрос, но как общий наконечник: при сокращении списка значений для одного значения , используйте функцию reduce. Я понимаю, конечно, что это учебное упражнение, но полезно знать соответствующую встроенную функцию для работы. Это делает вашу функцию гораздо короче:

def nlist2string(nlist): 

    def convert_to_alpha(s): 
     if isinstance(s,str): //check if s is already a string 
      return s   //if it is, return it unchanged 
     else: 
      return str(unichr(s+97)) //otherwise, get the corresponding alphabet 
            //and return that 
    def reduce_func(x,y): 
     //convert the numbers to alphabets 
     //and join the two together 
     return convert_to_alpha(x) + convert_to_alpha(y) 

    return reduce(reduce_func, nlist) 

Например, вывод:

l = [7,4,11,11,14] 
print nlist2string(l) 

является строка "hello".

Функция уменьшения принимает два аргумента, функцию, которая будет использоваться для свертывания списка в одно значение и список.

В более простом примере, что делает reduce:

function add(x,y): 
    return x + y 

print reduce(add, [1, 4, 3, 10, 5]) 
//Output: 23 
+0

Это излишество для этой простой программы ... – pradyunsg

+0

@Schoolboy Почему этот перебор? Он делает то же самое, что и выше, но требует гораздо меньше кода. –

+0

Я просто скопировал этот код и попытался запустить его со своим предыдущим nlist и получил много ошибок. Мне, вероятно, нужно импортировать некоторые модули и несколько других вещей, но это определенно слишком продвинуто для меня на данный момент. Мои навыки отладки отсутствуют или используются Google. Я действительно ценю вашу помощь, хотя! По крайней мере, я всегда могу ссылаться на это и, возможно, использовать его в будущем! Спасибо @Asad – jesiKat