2017-09-10 2 views
0

몇 시간 동안 해결책을 찾기 위해 몇 시간을 노력했지만 성공하지 못했습니다. 무엇이 있는지 모르지만 뭔가 빠졌습니다.목록에서 값을 다음 값과 이전 값과 비교하여 값을 검색하는 방법?

도움이나 제안이 필요 :

내가 두 개의리스트가 있습니다 : 여기

-D 내가 할 싶어 것입니다

v = [1, 3, 25, 67, 69, 72, 85, 120, 125, 130] 
d = [2, 22, 42, 2, 3, 13, 35, 5, 5] 

V는 가치와 D의 집합입니다 그것의 간격 계산됩니다

,

나는 말하자면, 이하에서 먼에만 vaues를 검색하기 위해 V를 필터링 할 VF (V 필터링)을 만들 것 5.

싶습니다 : 나는 '무엇

vf = [1, 3, 67, 69, 72, 120, 125, 130] 

지금까지 할 관리했습니다 : 내가 마지막 값을 누락

for i in range(len(v)-1) : 
...  if v[i] - v[i-1] <= 5 or v[i+1] - v[i] <= 5 : 
...    df.append(v[i]) 

vf 
[1, 3, 67, 69, 72, 120, 125] 

...

을하지만 말한다면 :

for i in range(len(v)) : 
...  if v[i] - v[i-1] <= 5 or v[i+1] - v[i] <= 5 : 
...    df.append(v[i]) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
IndexError : list index out of range 

감사합니다 사전에 어떤 제안을 위해 당신은

답변

0

이 코드를 시도 :-)있을 수 있습니다

v = [1, 3, 25, 67, 69, 72, 85, 120, 125, 130] 
d = [2, 22, 42, 2, 3, 13, 35, 5, 5] 
vf = [] 
for i in range(len(v)) : 

    if (i > 0 and (v[i] - v[i-1] <= 5)) or ((i < len(v) - 1) and (v[i+1] - v[i] <= 5)) : 
     vf.append(v[i]) 
print vf 
+0

@ etienne-s이게 작동하는지 알려주세요. –

+0

Waww는 간단했습니다! 진짜 좋은 작품! 또한 v [1] == 22로 시도해 보았고 vf는 실제로 v [0] (차이> 5)을 제거했습니다. 이것은 정확히 내가 원했던 것입니다. 많은 감사합니다! ;-) @ kshitij-mittal –

0

나는 당신이 원하는 결과를 정확히 다음 해요 확실하지 않다. v [k] -v [k-1] < = 5이면 v [k]를 유지하고이 비교가 불가능한 첫 번째 요소 v [0]도 유지한다고 가정했습니다.

v = [1, 3, 25, 67, 69, 72, 85, 120, 125, 130] 
vo = [1] + v[:-1] 
# thus: vo = [1, 1, 3, 25, 67, 69, 72, 85, 120, 125] 

vf = [x for (x,y) in map(None,v,vo) if x-y <= 5] 
print vf 

생산 : 그래서 여기 그렇게하는 파이썬 방법은 [1, 3, 69, 72, 125, 130]

이것은 지능형리스트를 사용하고 다음 맵으로, V는 당초 숫자 목록. vo는이 비교를 용이하게하기 위해 v와 같지만 offset과 같은 길이의 목록입니다. 이렇게하면 d를 별도로 계산하는 번거 로움을 줄일 수 있습니다.

이제 vf는 다음과 같이 목록 이해로 구성됩니다. vf는 요소 x가 포함됩니다. 여기서 x는 가져온 요소로 형성된 튜플에서 반복되는 방식으로 취해진 튜플 (x, y)에서 선택됩니다 v 및 vo (xy는 5 이하 임); 그렇지 않으면 x는 vf에 추가되지 않습니다. 아래의 자세한 예제를 참조하십시오.

지도에서 v 및 vo로부터 튜플 (x, y)의 목록을 만드는 중입니다. 일반적으로 map은 함수를 인수 목록에 매핑하는 데 사용됩니다 (인수 목록에 함수를 적용하기 위해). 이 경우 함수로 None을 사용하면 다음과 같이 v와 vo에서 튜플 목록을 만듭니다. [(v [0], vo [0]), (v [1], vo [1]), ...].

우선, (X, Y) = (V [0], VO [0]) = (1,1) : 지능형리스트에서

우리는 이렇게된다. x-y = 0 (< = 5)이므로 x = 1이 vf에 포함됩니다.

둘째, (x, y) = (v [1], vo [1]) = (3,1).x-y = 2 (< = 5)이므로 x = 3이 vf에 포함됩니다.

세 번째, (x, y) = (v [2], vo [2]) = (25,3). x-y = 22 (> 5)이므로 x = 25는 vf에 포함되지 않습니다.

등등. 의도 한 결과를 잘못 이해했다면 조정해야하지만 두 줄의 코드에서 원하는 결과를 얻으려면 목록 내포 및지도를 사용하는 방법에 대한 아이디어가 있어야합니다.

+0

도움을 주셔서 감사합니다. 나는 그것을 잘 이해하고 이해하기 위해 약간 노력해야 할 것입니다. ^^ 사실, 첫 번째 값은 두 번째 값과의 차이가> 5 일 때 삭제됩니다. –

+0

v [k + 1] -v [k] <= 5이면 v [k]를 유지 하시겠습니까? 이 경우 v에서 마지막 값을 유지하지 않습니까? –

+0

사실 그것은 일어날 수 있습니다. 정확히 v 범위를 벗어나는 문제였습니다. v가 이전 값 또는 다음 값과 너무 먼 경우 v에서 값을 검색하는 것이 아이디어입니다. 따라서 v [1] - v [0]> 5 AND v [len (v)] - v [len (v) - 1]> 5이면 vf에서 둘 다 검색하면 안됩니다. --- 죄송합니다. 첫 번째 게시물에서 명확하지 않은 경우 :-) –

관련 문제