2012-02-12 2 views
-5

나는 어젯밤과 조금은 오늘 아침에 답을 찾으려고했지만 운이 없었다. 숙제의 경우, 우리는 목록을 거쳐 가장 긴 연속 숫자를 반환하도록 요청 받았다. 나는이 코드에 대해 작업 해왔고 숫자 만 정확하게 비교했을 때 첫 번째 숫자와 비교했다. 나는 len (연속 증가)을 알아야합니다.코드 : 숫자 목록을 살펴보고 파이썬의 연속 증가 수를 인쇄하려면 어떻게해야합니까?

#!/usr/bin/python3 


import sys 
def fOpen(fname): 
     try: 
       fd = open(fname,"r") 
     except: 
       print("Couldn't open file.") 
       sys.exit(0) 
     all = fd.read().splitlines() 
     fd.close() 
     return all 

words = fOpen(sys.argv[1]) 



    current = [] 
    lastc = [] 


for x in words: 
     if len(current) == 0:           #Add the first number 
       current.append(int(x)) 
     elif len(current) == 1:           #Check first number < next number 
       if current[0] < int(x): 
         current.append(int(x)) 
       else:             #elif current[0] >= int(x): 
         if len(current) >= len(lastc): 
           lastc = current 
         current[:] = [] 
         current.append(int(x)) 
     elif len(current) >= 2: 
       if current[-1] < int(x): 
         current.append(int(x)) 
       else:             #elif current[-1] >= int(x): 
         if len(current) >= len(lastc): 
           lastc = current 
         elif len(current) < len(lastc): 
           current[:] = [] 
         current[:] = [] 
         current.append(int(x)) 

print(lastc) 

인쇄 진술서는 추적 할 수있게되어 나중에 제거됩니다. 미리 감사드립니다.

+0

이 단어입니까, 아니면이 숫자입니까? – moooeeeep

+0

그래서 ... 학생들은 전문가들이 무료로 숙제를하도록하러갑니다. 너무 많은 것이 돌아 다니고 있습니다. 이 코드에 대해 여러 가지 방법으로 깨졌으며, 휴식 시간을 배우고, 열거를 살펴 봅니다 ... 처음부터 시작하십시오 ... 도움을 청하기 전에 배우십시오. Seth, 미안 해요. –

+1

-1 제목에 "연속 증가"가 있지만 질문 본문에는 "연속 숫자"(매우 모호함)가 있으며 코드 주석에서 "최대 10 개의 정수 찾기"라고 말합니다. 원하는 것을 생각하고 그에 따라 질문을 편집하십시오. –

답변

2

내가 언급하고자하는 4 가지 사항이 있습니다. 다음은 코드 및 출력입니다.

def srk_func(words): 
    current = [] 
    lastc = [] 
    for x in words: 
     if len(current) == 0: 
       current.append(int(x)) 
     elif len(current) == 1: 
       if current[0] < int(x): 
         current.append(int(x)) 
       else:   
         if len(current) >= len(lastc): 
           lastc = current 
         current[:] = [] 
         current.append(int(x)) 
     elif len(current) >= 2: 
       if current[-1] < int(x): 
         current.append(int(x)) 
       else:   
         if len(current) >= len(lastc): 
           lastc = current 
         elif len(current) < len(lastc): 
           current[:] = [] 
         current[:] = [] 
         current.append(int(x)) 
    return lastc 

def jm_func(words): 
    current = [] 
    lastc = [] 
    for w in words: 
     x = int(w) 
     if not current: 
      # this happens only on the first element 
      current = [x] 
      continue 
     if x > current[-1]: 
      current.append(x) 
     else: 
      # no increase, so current is complete 
      if len(current) >= len(lastc): 
       lastc = current 
      current = [x] 
    # end of input, so current is complete 
    if len(current) >= len(lastc): 
     lastc = current 
    return lastc 

tests = """\ 
    1 
    1 5 
    5 1 
    1 5 7 
    7 5 1 
    1 5 7 0 
    1 5 7 0 3 
    1 5 7 0 2 4 6 8 
    1 3 5 7 9 11 0 2 
    """ 

for test in tests.splitlines(): 
    wds = test.split() 
    print wds 
    print srk_func(wds) 
    print jm_func(wds) 
    print 

8<-------------------------------------------------- 

['1'] 
[] 
[1] 

['1', '5'] 
[] 
[1, 5] 

['5', '1'] 
[1] 
[1] 

['1', '5', '7'] 
[] 
[1, 5, 7] 

['7', '5', '1'] 
[1] 
[1] 

['1', '5', '7', '0'] 
[0] 
[1, 5, 7] 

['1', '5', '7', '0', '3'] 
[0, 3] 
[1, 5, 7] 

['1', '5', '7', '0', '2', '4', '6', '8'] 
[0, 2, 4, 6, 8] 
[0, 2, 4, 6, 8] 

['1', '3', '5', '7', '9', '11', '0', '2'] 
[0, 2] 
[1, 3, 5, 7, 9, 11] 

[] 
[] 
[] 

주제 1 : 코드를 테스트하십시오.

주제 2 : 중복 : len(current) == 1에 대한 코드는 렌> = 2 코드 기능적으로 동일하고, 후자는 다음과 같은 불필요한 두 줄함으로써 부풀어 :

elif len(current) < len(lastc): 
     current[:] = [] 

당신은 두 가지를 결합 할 수 있습니다 사례들; 내 버전을 참조하십시오.

주제 3 : 입력을 처리하고 해당 상태에 도달하면 집에 즉시 포장하거나 집에 갈 수없는 "상태"(이 경우 현재 및 lastc)를 유지하는 알고리즘의 이런 종류의 경우에 종종 발생합니다. 입력의 끝; 그 상태로 무언가를해야합니다.

주제 4 : 기술적 인 문제는 있지만 새로운 Python 플레이어에게는 일반적인 함정입니다.

>>> current = [1, 2, 3, 4, 5] 
>>> lastc = current # lastc and current refer to THE SAME LIST; no copying! 
>>> print current 
[1, 2, 3, 4, 5] 
>>> print lastc 
[1, 2, 3, 4, 5] 
>>> current[:] = [] # The list to which current refers is cleared 
>>> print current 
[] 
>>> print lastC# lastc refers to the same list 
[] 

새 목록에 current이라는 이름을 지정하는 것이 좋습니다. 내 코드를 참조하십시오.

주제 5 (추가 보너스) : 8이 아닌 4 바이트 들여 쓰기를 고려하십시오.SO 질문 또는 대답 == FAIL :-)에 가로 및 세로 스크롤 막대가 나타나게합니다.

+0

답변 해 주신 John에게 감사드립니다. PUTTY에서 복사 한 원본 코드를 언제 게시했는지 알지 못했습니다. 팁을 주셔서 감사합니다. -'len (current) == 1'은리스트에서 마지막 숫자를 참조하려고 할 때'[-1] '이 잘못 되었기 때문에 입력되었습니다. 또한,'len (current)> len (lastc)'를 비교하는 것은 current의리스트를 잘못 지정했다. 여러 개의 print 문을 삽입 한 후,'long_run = max (len (currnet), long_run)'이 훨씬 쉽게 작동한다는 것을 알게되었습니다. 주제 4 - 와우 존, 명시 적으로 언급하지 않았다면 - 나는 결코 알지 못했을 것입니다. –

0

중첩 된 루프가 너무 많기 때문에 첫 번째 숫자 만 비교합니다. 대신 목록을 한 번만 살펴 봐야합니다.

기준이 충족되면 다음 번호를 추가하는 목록으로 빈 last_best_runthis_run으로 시작하고 기준이 충족되지 않을 때 다시 시작하십시오. 바람직하지 않은 문자열 비교를 피하려면 숫자를 숫자 유형 (예 : float 또는 int)으로 변환해야합니다.

길이가 더 큰 경우 this_runlast_best_run에 할당하면됩니다.

+0

응답 해 주셔서 감사합니다. 그게 효과가 있지만,이 프로그램은 천만 개 이상의 숫자를 실행하는 것임을 언급하는 것을 잊었습니다. 그렇게 여러 번 실행하는 것은 문제가 될 수 있습니다. - 그 대답을 잘못 읽었습니다. –

+0

다음과 같이 임의의 숫자를 사용하여 수동으로이 작업을 시도해 보는 것이 도움이 될 수 있습니다. 1 4 2 8 2 5 7 9 3 4 3 6 8 ... 나는 당신이 moooeeep이 정확하다는 것을 알게 될 것입니다. 백 트랙킹없이 목록을 단일 패스로 실행합니다. –

+0

글쎄,이 방법으로, 나는 그것을 거의 가지고있다 -하지만 어떻게 목록을 비울 수 있습니까? –

-1

힌트 # 1 : 증가하는 숫자의 숫자를 빼는 경우 숫자 목록에 어떤 변화가 있는지보십시오. 예를 들어

words = [10,11,12,5,6,7,8,9,1,0] 경우, 단어에서 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 감산 상상 :

10 11 12 5 6 7 8 9 1 0 
- 0 1 2 3 4 5 6 7 8 9 
    ------------------------- 
    10 10 10 2 2 2 2 2 -7 -9 

힌트 # 2 : itertools.groupby 동일한 항목의 기 서열을 함께 할 수있다.

+0

응답 해 주셔서 감사합니다. 나는 힌트 # 1을 따를 수 있는지 확신하지 못한다. (이것은 CS로서의 두 번째 학기에만 해당된다.) 그리고 힌트 # 2를 위해 - 그것이 효과가 있지만, 나는 교수가 우리 자신의 방법을 만들기를 원한다고 거의 긍정적이다. 다시 한 번 감사드립니다! –

+0

-1 힌트 1에 대해서는 확실하지 않습니다. 이것은 증가가 1로 제한되는 경우에만 "작동"하는 것으로 보입니다. 설명에 10 12 14 5 6 8 11 15 20 26을 포함하십시오. –

관련 문제