2011-10-27 2 views
2

그래서 나는이 같은 것입니다 목록 유무 :목록 안에 작은 목록의 정확한 위치를 찾기 (파이썬)

list=[10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 9.9, 9.9, 9.9, 10.0, 10.0, 10.0, 10.2, 10.0, 9.9, 9.9, 9.9, 9.9, 10.0, 10.2, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.2, 10.5, 10.9, 10.5, 10.3, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.4, 10.7, 10.3, 10.2, 10.1, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 9.9, 9.9, 10.1, 9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.7, 9.8, 9.8, 9.7, 9.7, 9.7, 9.7, 9.7, 9.7, 9.6, 9.7] 

을 그리고 난이 같은 형태의 하위 목록이 있습니다

sublist=[9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8]

이제이 작은 목록으로 수행해야 할 작업은 기본 목록에있는 위치를 찾아야한다는 것입니다. 그래서이 경우 결과는 다음과 같아야합니다. index = 119 (+/- 1로 꺼져있을 수도 있음)

나는 하루 종일 이렇게하려고 노력했습니다. 웹 ... 몇 가지 아이디어가 있습니다.

1) 목록의 하위 목록의 첫 번째 항목을 찾습니다.이 경우 4 일 것이므로 다음 번호도 맞습니다. 그 다음에 잘못 될 것이고 나머지리스트 [4. :]에서 또 다른 9.9를 찾아 똑같은 루프를 반복 할 것입니다. 정확한 일치가 발견 될 때까지

2) 다른 생각은 다음과 같습니다. 어떻게 든 문자열을 사용하십시오 str (이 경우에는 687의 답을 줄 것입니다. ...

이러한 아이디어의 문제점은 문제가 될 것 같지 않다는 것입니다 ([1 : -1] .find (str (sublist) [1 : -1]). ... 길고 실수도 나는이 아이디어를 작동하게 할 수 없었던

답변

3

방법에 대해 :

l = [10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 9.9, 9.9, 9.9, 10.0, 10.0, 10.0, 10.2, 10.0, 9.9, 9.9, 9.9, 9.9, 10.0, 10.2, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.2, 10.5, 10.9, 10.5, 10.3, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.4, 10.7, 10.3, 10.2, 10.1, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 9.9, 9.9, 10.1, 9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.7, 9.8, 9.8, 9.7, 9.7, 9.7, 9.7, 9.7, 9.7, 9.6, 9.7] 
subl = [9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8] 
for i in xrange(len(l)-len(subl)): 
    if l[i:i+len(subl)] == subl: 
    print 'found at pos', i 
    break 
else: 
    print 'not found' 

found at pos 118를 인쇄합니다.

P. list이 내장 함수를 음영 처리하지 않도록 변수의 이름을 변경했습니다.

+0

와우! 그건 정말 훌륭합니다! 진지하게, 이것은 내가 필요로했던 바로 그 것이다. .. 그것은 간단하지만 또한 직업을한다. .. 내가 그렇게 생각하지 않았던 나쁨은 이것을 생각한다 고맙다! –

1

두 번째 아이디어는 거짓 긍정을 줄 수 있습니다. 하위 목록이 단일 값인 경우 1, 전체 목록의 값이 11 인 경우 일치 항목을 찾습니다. 문자열에 선행 및 후행 구분 기호를 추가하면이 문제를 피할 수 있습니다.

첫 번째 아이디어는 최적의 솔루션의 중간입니다. 당신이 "재사용"할 수있는 부분 문자열의 양을 결정하기위한 알고리듬 (그 이름은 지금 나를 빼앗아 간다.)이 있기 때문에 전체 문자열로 되돌릴 필요가 없다. 예를 들어, 9.9를 찾았 기 때문에 현재 후보자가 실패했다고 가정합니다. 하위 문자열의 첫 번째 요소와 일치하기 때문에 해당 요소를 다시 방문 할 필요가 없습니다. 그것들은 미리 계산 될 수 있으므로, 당신은 단지 한 번에 전체 목록을 보게됩니다.

+0

첫 번째 아이디어에 대한 생각 ... 좋은 예 .. 두 번째 질문은 예라고 생각합니다. 대답 해 주셔서 감사합니다. –

2
ind = l.index(subl[0]) 
for i in xrange(l.count(subl[0])-1): 
    if l[ind:ind+len(subl)] == subl: 
     print (ind) 
     break; 
    ind = l.index(subl[0],ind+1) 

이것은 그것이 subl의 첫번째 값이 존재하는 적어도 아는 경우에만 비교한다 효율적인 방법이다.

1
idx = next(i for i in range(len(lst)-len(sublst)) if lst[i:i+len(sublist)] == sublst) 
# 118