x보다 큰 목록에서 첫 번째 인덱스를 찾는 가장 Pythonic 방법은 무엇입니까?
예를 들어
list = [0.5, 0.3, 0.9, 0.8]
함수
f(list, 0.7)
돌아올 것이다
2.
x보다 큰 목록에서 첫 번째 인덱스를 찾는 가장 Pythonic 방법은 무엇입니까?
예를 들어
list = [0.5, 0.3, 0.9, 0.8]
함수
f(list, 0.7)
돌아올 것이다
2.
2
때문에 0.9 > 0.7
나 때문에는 0.8 > 0.7
? 즉, 순차적으로 검색합니까 아니면 값이 증가하는 순서대로 검색합니까?
답변:
next(x[0] for x in enumerate(L) if x[1] > 0.7)
next()
가독성 을 위해 다음과 같습니다.next(i for i,v in enumerate(L) if v > 0.7)
itertools.chain()
이와 같은 목록을 추가하는 대신 사용하십시오 .
next((i for i, x in enumerate(L) if x > value), -1)
목록이 정렬되면 bisect.bisect_left(alist, value)
큰 목록의 경우보다 빠릅니다 next(i for i, x in enumerate(alist) if x >= value)
.
bisect_left
는 O (log n)이고 listcomp는 O (n)입니다. 즉, 더 클수록 측면 n
에서 더 많은 이점이 bisect_left()
있습니다. 나는의 인덱스를 찾기 위해 노력했습니다 500_000
에 range(10**6)
사용 bisect_left()
> 3.75 마이크로와 함께 genexpr를 사용하여 - next()
[> 51.0 밀리 초 - 10_000
느린 같은 예상 시간].
filter(lambda x: x>.7, seq)[0]
bisect_left()
(가장 빠름) 느리고 enumerate()
.
>>> alist= [0.5, 0.3, 0.9, 0.8]
>>> [ n for n,i in enumerate(alist) if i>0.7 ][0]
2
IndexError: list index out of range
합니다.. index = next[ n for n,i in enumerate(alist) if i>0.7 ]
오류를 사용하면 NameError: name 'index' is not defined
. next
약간 더 빠릅니다. 타이밍 차이는 60,000 개의 숫자에 대해 12.7ns 대 11.9ns입니다.
다른 것:
map(lambda x: x>.7, seq).index(True)
1) NUMPY ARGWHERE, 일반 목록
numpy를 사용하는 것이 좋으면 일반 목록 (정렬 또는 정렬되지 않음)에서 다음이 작동합니다.
numpy.argwhere(np.array(searchlist)>x)[0]
또는 목록으로 답변이 필요한 경우 :
numpy.argwhere(np.array(searchlist)>x).tolist()[0]
또는 정수 인덱스로 답이 필요한 경우 :
numpy.argwhere(np.array(searchlist)>x).tolist()[0][0]
2) NUMPY SEARCHSORTED, 정렬 된 목록 (목록 검색에 매우 효율적)
그러나 검색 목록이 정렬되어 있으면 np.searchsorted 함수를 사용하는 것이 훨씬 더 깔끔하고 좋습니다 .
numpy.searchsorted(searchlist,x)
이 함수를 사용할 때 좋은 점은 단일 값 x를 검색 할뿐만 아니라 x도 목록이 될 수 있다는 것입니다. 즉, 검색된 값 목록 [x1, x2, x3 .. xn에 대한 색인 목록을 반환 할 수도 있습니다. ], ( 이 경우 목록 이해력에 비해 매우 효율적입니다 ).
내 목록이 매우 길 때 비슷한 문제가 발생했습니다. 이해력 또는 필터 기반 솔루션은 전체 목록을 통과합니다. itertools.takewhile은 조건이 처음 거짓이되면 루프를 중단합니다.
from itertools import takewhile
def f(l, b): return len([x for x in takewhile(lambda x: x[1] <= b, enumerate(l))])
l = [0.5, 0.3, 0.9, 0.8]
f(l, 0.7)
이미 많은 답이 있다는 것을 알고 있지만 가끔 비단뱀이라는 단어가 '한 줄'로 번역되는 느낌이 듭니다.
더 나은 정의 가이 답변에 더 가깝다고 생각할 때 :
"Python 언어의 기능을 활용하여 명확하고 간결하며 유지 관리 할 수있는 코드를 생성합니다."
위의 답변 중 일부는 간결하지만 명확하지 않으며 초보자 프로그래머가 이해하는 데 시간이 걸리므로 많은 기술 수준으로 구성된 팀에 대해 매우 유지 관리 할 수 없습니다.
l = [0.5, 0.3, 0.9, 0.8]
def f(l, x):
for i in l:
if i >x: break
return l.index(i)
f(l,.7)
또는
l = [0.5, 0.3, 0.9, 0.8]
def f(l, x):
for i in l:
if i >x: return l.index(i)
f(l,.7)
위의 내용은 초보자가 쉽게 이해할 수 있으며 베테랑 파이썬 프로그래머가 받아 들일만큼 간결하다고 생각합니다.
멍청한 코드를 작성 하는 것이 긍정적 이라고 생각 합니다.
>>> f=lambda seq, m: [ii for ii in xrange(0, len(seq)) if seq[ii] > m][0]
>>> f([.5, .3, .9, .8], 0.7)
2
다음을 사용하여이 작업을 수행 할 수도 있습니다 numpy
.
import numpy as np
list(np.array(SearchList) > x).index(True)
이걸로 해봐:
def Renumerate(l):
return [(len(l) - x, y) for x,y in enumerate(l)]
예제 코드 :
Renumerate(range(10))
산출:
(10, 0)
(9, 1)
(8, 2)
(7, 3)
(6, 4)
(5, 5)
(4, 6)
(3, 7)
(2, 8)
(1, 9)