2013-03-29 6 views
1

내 질문에 사소한 것이 있으면 사과드립니다. 차라리 대화방에서 이것을 부탁합니다. 그러나 지금은 저의 평판이 너무 낮아 파이썬 대화방에서 아무 것도 묻지 못합니다. 나는 현재 수업을 위해 파이썬을 배우고 있으며 선생님은 우리가 일하도록하기 위해 연습 문제를주었습니다. 지금 구축하고있는 함수는 숫자 목록을 받아 문자열로 변환합니다. 내가 가지고있는 문제는 if 문이 결코 사실로 평가되지 않는다는 것입니다. 변수를 다루는 몇 가지 방법을 시도해 보았고 많은 인쇄 문을 추가하여 평등한지 확인했지만 아무 소용이 없는지 확인했습니다. 다시 한번 감사드립니다. 당신은 문자열을 정수로 numbers 대한 정의를 변경하려고 비교하기 위해 노력하고있다Python If 문이 True로 평가되지 않음

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 = [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). num1num2을 비교할 때

현재, 당신이 진실하지 않습니다하는 4 == '4' 같은 비교를하고있을 것입니다 :

>>> 4 == '4' 
False 

당신이 당신의 numbers 목록을 작성하는 방법을 변경하는 대신, 당신은에 num2을 변환 할 수 있습니다 정수 또는 num1을 비교하기 전에 문자열에 넣으므로 num1 == int(num2) 또는 str(num1) == num2입니다.

+1

또는 num2 = int (numbers [i]) –

+0

몇 초 늦었습니다. 나는 내 대답을 지울거야. – Dilawar

+2

그 목록을 만드는 더 좋은 방법은 다음과 같습니다 :'range (26)' –

0

파이썬에서 문자열 리터럴과 숫자는 별도의 객체 유형이며 동일하지 않습니다.

1 == "1" 

은 거짓을 반환합니다.

숫자 문자열 목록을 반복하고 있지만 실제 숫자 목록은 아닙니다.

range() 함수 (파이썬이 내장되어 있음)를 사용하여 수동으로 숫자 목록을 생성하는 대신 번호 목록을 생성 할 수 있습니다.

1

0-25의 문자열 목록이 있습니다.
파이썬에서 문자열은 결코 숫자와 같지 않으므로 num1 == num2은 항상 거짓입니다.

그래서,

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의 값을 편집하지 않으려면,이 조건 사용 : 정수로

if num1 == int(num2): 

이 변환됩니다 NUM2을, 그것은 당신이하고 싶은 일입니다.
또한,이 경우에, 당신과 같이 더 가독성을 위해 map (Built-in Function)를 사용할 수 있습니다

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

제대로 위의 대답은 문제를 해결하지만, 일반적인 팁 등 : 하나의 값으로 값 목록을 줄일 때 reduce 기능을 사용하십시오. 물론 이것이 학습 활동이라는 것을 알지만 작업 관련 inbuilt 기능을 아는 것이 유용 할 수 있습니다. 예를 들어

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 함수는 두 개의 인수, 목록을 단일 값으로 축소하는 데 사용되는 함수 및 목록을 사용합니다. 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을 사용합니다. 그래도 정말 고마워! 적어도 나는 이것을 항상 참고할 수 있으며, 미래에 그것을 사용할 수도있다. Thanks @ Asad – jesiKat

관련 문제