2013-01-31 4 views
2

1 숫자 범위를 찾는 일련의 숫자를 반복합니다 (예 : < 100).내부 루프에서 계속하려면 파이썬 외부 루프

예 : list = [1, 2, 3, 125, 7, 8, 9, 200]. 파일 : 1-3, 7-9에 들어가고 싶습니다. 내가 직면 한 문제는 바깥 쪽 루프가 내부 루프의 항목을 반복하므로 1-3 세, 2-3, 3, 7-9, 8-9, 9가 출력된다는 것입니다.

작동 나의 현재 전략 : 같은 (대신 추가 카운터를 사용하는 내부 루프에서 반복 된 항목을 통해 건너 외부 루프를 얻을 수있는 더 파이썬 방법이 있는지

counter = 1 

for i in range(len(list)): # outer loop 
    if counter > 1: # prevents the outer loop from iterating the numbers iterated in inner loop 
     counter -= 1 
     continue 
    elif counter <=1: 
     while list[i] < 100: 
      i +=1 
      counter +=1 
      if list[i] > 100: 
       print list[i-counter], '-', list[i] 
       break 

이 궁금하네요 나는 위에했다). 감사.

편집 : 연속 번호에 초점을 맞춘 답글이 거의 없습니다. 나의 실수는 숫자가 연속적 일 필요가 없다. 해당 범위의 처음과 마지막 숫자 만 필요합니다. 예. list = [1,4,8,12,57,200,4,34,300]. 출력 : 1 - 57, 4 - 34. 목록 및 기준은 사용자에 따라 다릅니다. 기준은 항상 비교 연산자 '<'이있는 숫자입니다. 감사.

답변

4

두 개의 루프가 필요하지 않습니다. 하나는 충분하다 :

def ranges(seq): 
    it = iter(seq) 
    start = end = next(it) 
    for val in it: 
    if val == end + 1: 
     end = val 
    else: 
     if end - start > 1: 
     yield start, end 
     start = end = next(it) 

for start, end in ranges([1, 2, 3, 125, 7, 8, 9, 200]): 
    print('%d-%d' % (start, end)) 

논리가 당신에게 약간 다릅니다 : 그것은 연속 번호 (귀하의 예제에서 1 2 37 8 9)로 구성 시퀀스를 찾습니다. 필요한 경우 숫자를 >= 100으로하여 논리를 변경하여 시퀀스를 쉽게 구분할 수 있습니다. 반면에 기반

+0

감사합니다, 나는 아직도 그것을 알아 내려고 노력하고있어. 내 문제에 대한 추가 정보를 추가했습니다. 귀하의 제안은 여전히 ​​유효합니까? – jonoave

+1

이 방법을 시도했는데 필요한만큼 잘 작동합니다. 두 번째 질문은 목록에있는 항목의 위치도 필요합니다. 'start'와 'end'의 인덱스 값을 빠르게 얻을 수 있습니까? 감사합니다 – jonoave

2

다른 접근 방식, 루프 :

def print_ranges(given_list, limit): 
    while given_list: 
     start = end = given_list.pop(0) 
     if start < limit: 
      while given_list and (given_list[0] < limit): 
       end = given_list.pop(0) 
      if (end != start): 
       print "%d-%d"%(start,end) # or save it in another list 

몇 가지 테스트 :

>>> print_ranges([1,4,8, 200, 4,34, 72, 300], 100) 
1-8 
34-72 

>>> print_ranges([1, 4, 8, 12, 57, 200, 4, 34, 300], 100) 
1-57 
4-34 

>>> print_ranges([1, 4, 8, 12, 57, 200, 4, 34, 300], 250) 
1-34 
+0

죄송합니다 정렬 옵션이 아닙니다. 원래 게시물에서 목록에있는 항목의 위치가 중요하고 출력 될 것이라고 언급하지 않았습니다. 실제로 나는 당신의 제안이 내가 원하는 것에 맞는지 분명하지 않다. 기준 (예 : <100) 및 목록은 실제로 사용자 입력에 의존합니다. – jonoave

+0

좋아요, 신경 쓰지 마세요, 정말 선택 사항입니다 ... 나는 그것을 완성했으며 앞으로의 독자들을 위해 추가했습니다. :) – furins

+0

@jonoave 나는 내 대답을 편집했고 끝이 <100 인 제약 조건을 추가했습니다.분명히 given_list는 사용자 입력에 의해 제공 될 것이고, 나는 당신의 질문과 같이 그것을 정의하여 실제 예제를 제공 할 것이다. – furins

0

zip() 사용 :

zip(lis,lis[1:]) 반환 무엇인가 :

[(0, 1), 
(1, 2), 
(2, 3), 
(3, 5), 
(5, 6),...] 
,

이제이 목록을 반복하여 차이가 1인지 아닌지 확인할 수 있습니다.

코드 : 답장을 보내

In [103]: def ranges(lis): 
    ans=[] 
    z=zip(lis,lis[1:]) 
    for x,y in z: 
     if y-x==1: 
      ans.extend([x,y]) 
     else:  
      if ans: 
       yield "{0}-{1}".format(min(ans),max(ans)) 
       ans=[] 
    if ans:   
      yield "{0}-{1}".format(min(ans),max(ans)) 
    .....:   

In [104]: lis=[0,1,2,3,5,6,7,8,10,11,2,3,4] 

In [105]: list(ranges(lis)) 
Out[105]: ['0-3', '5-8', '10-11', '2-4']