IT박스

아무것도 발견되지 않을 때 예외를 발생시키지 않는 Python 용 list.index () 함수

itboxs 2020. 12. 5. 09:25
반응형

아무것도 발견되지 않을 때 예외를 발생시키지 않는 Python 용 list.index () 함수


list.index(x)항목이 존재하지 않으면 Python에서 예외가 발생합니다. 예외를 처리 할 필요가없는 더 나은 방법이 있습니까?


일치하는 요소가 어디에 있는지 신경 쓰지 않는다면 다음을 사용하십시오.

found = x in somelist

관심이 있다면 조건식 과 함께 LBYL 스타일 을 사용하십시오 .

i = somelist.index(x) if x in somelist else None

목록에 대한 자체 색인을 구현 하시겠습니까?

class mylist(list):
  def index_withoutexception(self,i):
    try:
        return self.index(i)
    except:
        return -1

따라서 목록을 사용하고 index2를 사용하여 오류가 발생한 경우 원하는 것을 반환 할 수 있습니다.

다음과 같이 사용할 수 있습니다.

  l = mylist([1,2,3,4,5]) # This is the only difference with a real list
  l.append(4) # l is a list.
  l.index_withoutexception(19) # return -1 or what you want

필요한 것을 수행하는 함수를 작성하십시오.

def find_in_iterable(x, iterable):
    for i, item in enumerate(iterable):
        if item == x:
            return i
    return None

항목이 있는지 여부 만 알면되고 인덱스는 알 필요가없는 경우 다음을 사용할 수 있습니다 in.

x in yourlist

네, 있습니다. 예를 들어 할 수 있습니다. 다음과 유사한 작업을 수행하십시오.

test = lambda l, e: l.index(e) if e in l else None

다음과 같이 작동합니다.

>>> a = ['a', 'b', 'c', 'g', 'c']
>>> test(a, 'b')
1
>>> test(a, 'c')
2
>>> test(a, 't')
None

그래서, 기본적으로, test() 요소의 인덱스 반환됩니다 주어진 목록 (첫 번째 매개 변수) 내에서 (두 번째 매개 변수) 가 발견되지 않는 한 (이 경우에는 반환합니다 None, 그러나 당신이 적합한 찾을 아무것도 할 수있다).


요약 : 예외는 귀하의 친구이며 명시된대로 질문에 대한 최선의 접근 방식입니다.

OP는 유스 케이스의 경우 인덱스가 무엇인지 아는 것이 실제로 중요하지 않다는 의견을 명시했습니다. 허용되는 답변 메모와 같이 x in somelist상관하지 않으면 사용하는 것이 가장 좋은 답변입니다.

원래의 질문에서 알 수 있듯이 그러나 나는 당신이 것을, 가정합니다 않는 인덱스가 무엇인지 관심. 이 경우 다른 모든 솔루션은 목록을 두 번 검색해야하므로 성능이 크게 저하 될 수 있습니다.

또한 유서 깊은 Raymond Hettinger가 의견에 썼 듯이

-1을 반환 한 list.find가 있더라도 i == -1인지 확인하고 조치를 취하기 위해 테스트해야합니다.

그래서 저는 예외를 피해야한다는 원래의 질문에서 가정을 되돌릴 것입니다. 예외는 당신의 친구라고 제안합니다. 그들은 두려워 할 필요가 없으며 비효율적이지 않으며 실제로 좋은 코드를 작성하기 위해 그들과 잘 알고 있어야합니다.

그래서 가장 좋은 대답은 단순히 try-except 접근 방식을 사용하는 것입니다.

try: i = somelist.index(x) except ValueError: # deal with it

" deal with it "은 당신이해야 할 일을하는 것을 의미합니다 : i를 센티넬 값으로 설정하고, 당신 자신의 예외를 일으키고, 다른 코드 브랜치를 따르는 등.


시퀀스의 어디에 있는지 신경 쓰지 않고 존재 만 신경 쓰면 in연산자 를 사용하십시오 . 그렇지 않으면 예외 처리를 리팩토링하는 함수를 작성하십시오.

def inlist(needle, haystack):
  try:
    return haystack.index(needle)
  except ...:
    return -1

도움이 되었기를 바랍니다

lst= ','.join('qwerty').split(',') # create list
i='a'  #srch string
lst.index(i) if i in lst else None

gluon 패키지의 스토리지 모듈에있는 Web2py의 List 클래스 를 사용하고 싶습니다 . 스토리지 모듈은 요소를 찾을 수 없을 때 오류를 발생시키지 않는 목록 형 (List) 및 사전 형 (Storage) 데이터 구조를 제공합니다.

먼저 web2py의 소스를 다운로드 한 다음 gluon 패키지 폴더를 Python 설치의 사이트 패키지에 복사하여 붙여 넣습니다.

이제 시도해보십시오.

>>> from gluon.storage import List
>>> L = List(['a','b','c'])
>>> print L(2)
c
>>> print L(3) #No IndexError!
None

또한 일반 목록처럼 작동 할 수도 있습니다.

>>> print L[3]

Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
l[3]
IndexError: list index out of range

원하는 작업을 수행하는 기본 제공 방법이 없습니다.

Here is a good post that may help you: Why list doesn't have safe "get" method like dictionary?

참고URL : https://stackoverflow.com/questions/8197323/list-index-function-for-python-that-doesnt-throw-exception-when-nothing-found

반응형