2016-07-01 1 views
0

현재 다음 중 하나와 같은 목록을 검색 할 수있는 알고리즘을 찾고 있습니다 : [1,1,1,1,2,3,4,5,5,5,3,2] 이 예제에서 첫 번째 " 1 "옆에 중복이 있으므로 옆에 중복 번호가있을 때까지 목록을 계속 읽은 다음이 번호의 마지막 번호 (예 :이 예에서는"5 ")를 선택하십시오.목록을 살펴보고 Python을 체크인하십시오

i=0  

for i in range(len(X)): 

    if (X[i] == X[i+1]): 
     first_number = X[i] 

    elif (X[i] != X[i+1]): 
     i+=1 

내 질문에 추가 조건을 추가하고 싶습니다 : 는 결국, 나는 현재이 코드가이 두 숫자 사이의 차이 (. 즉, 5-1)

을합니다. 다음 목록이 있다고 가정하십시오. lst = [1,1,1,1,2,3,4,5,5,5,3,3,3,3,2,2,2,4,3]이 이 경우 코드 = lst = [4, -2, -1]에 따라 다음과 같은 차이점을 얻은 다음 중지합니다. 그러나 "4"다음에 "4"보다 작은 숫자가옵니다 (따라서 반대 방향으로 - 최대 - "2"다음에 " 4 "). 나는 이것이 충분히 명확하길 바란다. 많은 감사

+0

는이 알고리즘이 무엇을해야하는지의 예 입력 및 출력을 제공 할 수 있을까요? 차이점 (예 : 5-1)은 어디에서 추가됩니까? – NonlinearFruit

+1

그럼 첫 번째 복제본과 두 번째 복제본의 차이점을 찾으십니까? – 8090PZ

+0

일단 첫 번째 숫자가 있으면 '중단'합니다. 그런 다음'range (len (X) - 1, -1, -1) '을 뒤집어서 마지막 점을 찾으십시오. –

답변

0

그런 다음 이들의 첫번째 둘 사이의 차이를 찾을 수, 반복 수의 그룹을 찾기 위해 itertools.groupby를 사용할 수 있습니다

>>> import itertools 
>>> lst = [1,1,1,1,2,3,4,5,5,5,3,2] 
>>> duplicates = [k for k, g in itertools.groupby(lst) if len(list(g)) > 1] 
>>> duplicates[1] - duplicates[0] 
4 

를 아니면, 제 1 및 마지막의 차이를 원하는 경우 duplicates[-1] - duplicates[0]를 사용 반복 번호. 지금 생각

>>> lst = [1,1,1,1,2,3,4,5,5,5,3,3,3,3,2,2,2] 
>>> duplicates = [k for k, g in itertools.groupby(lst) if len(list(g)) > 1] 
>>> duplicates 
[1, 5, 3, 2] 
>>> [x - y for x,y in zip(duplicates, duplicates[1:])] 
[-4, 2, 1] 

내가 당신이 원하는 무엇을 가지고 : 당신이 연속 반복되는 숫자의 모든 쌍의 차이를 원한다면 더 일반적인 경우

, 당신은 zip에 있음을 결합 할 수있는 당신을 고원이 반복되는 값이거나 지역 최소값 또는 최대 값 인 목록의 연속적인 "평원"사이의 차이를 원하십시오. 이것은 좀 더 복잡하고 여러 가지 조치를 취할 것입니다 : 당신은 1의 시작 인덱스 enumerate을 사용할 수 있습니다

>>> lst=[1,1,1,1,2,3,4,5,5,5,3,3,3,3,2,2,2,4,3] 
>>> plateaus = [lst[i] for i in range(1, len(lst)-1) if lst[i] == lst[i-1] 
...             or lst[i-1] <= lst[i] >= lst[i+1] 
...             or lst[i-1] >= lst[i] <= lst[i+1]] 
>>> condensed = [k for k, g in itertools.groupby(plateaus)] 
>>> [y-x for x, y in zip(condensed, condensed[1:])] 
[4, -2, -1, 2] 
+0

친애하는 downvoter, 왜 downvote을 설명하는 신경? 내가 그 질문을 잘못 이해했다고 생각하니? 이 경우 저를 계몽하십시오. –

+0

답변 해 주셔서 감사합니다. 아직도 몇 가지 문제가 있습니다. 내 코드 : 중복 = [K에 대한 K, itertools.groupby (X)에서 g 렌 경우 (리스트 (g))> 1] 중복 : itertools에서 가 GROUPBY를 가져 itertools 데프 check_f1 (X)로서 [1] - duplicates [0] – sammtt

+0

@sammtt 가져 오기가 잘못되었습니다 : itertools에서 가져 오기 groupby 대신 itertools로'import itertools'를 실행하십시오. –

1

. 중복 된 전류 값은 이전의 인덱스 값과 동일한 경우에 검출된다

l = [1,1,1,1,2,3,4,5,5,5,3,2] 
r = [v for i, v in enumerate(l, 1) if i < len(l) and v == l[i]] 

result = r[-1] - r[0] 
# 4 

목록 r 모든 중복리스트이다. r[-1]은 마지막 항목이며 r[0]은 첫 번째 항목입니다.

더 많은 시험 :

>>> l= [1,1,5,5,5,2,2] 
>>> r = [v for i, v in enumerate(l, 1) if i < len(l) and v == l[i]] 
>>> r[-1] - r[0] 
1 
+0

흠, OP의 질문은 다소 모호합니다. 한 문장에서 그는 "다음"중복 번호를 찾고 "마지막"과 첫 번째 차이점을 취합니다 ... –

1

솔루션 :

def subDupeLimits(aList): 
    dupList = [] 
    prevX = None 
    for x in aList: 
     if x == prevX: 
      dupList.append(x) # track duplicates 
     prevX = x # update previous x 

    # return last duplicate minus first 
    return dupList[-1] - dupList[0] 

# call it 
y = subDupeLimits([1,1,1,1,2,3,4,5,5,5,3,2]) 
# y = 4 
관련 문제