programing

아무것도 찾을 수 없을 때 예외를 던지지 않는 파이썬용 list.index() 함수

cafebook 2023. 8. 26. 12:17
반응형

아무것도 찾을 수 없을 때 예외를 던지지 않는 파이썬용 list.index() 함수

파이의list.index(x)항목이 없는 경우 예외를 발생시킵니다.예외 처리를 요구하지 않는 더 나은 방법이 있습니까?

일치하는 요소가 어디에 있는지 상관없는 경우 다음을 사용합니다.

found = x in somelist

관심이 있다면 조건부 표현이 있는 LBIL 스타일을 사용합니다.

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

그래서, 당신은 리스트를 사용할 수 있고, 당신의 인덱스2와 함께, 오류가 발생했을 때 당신이 원하는 것을 반환할 수 있습니다.

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

  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

TL;DR: 예외는 여러분의 친구이며, 언급된 질문에 대한 최선의 접근법입니다.
허락보다 용서를 구하는 것이 더 쉽습니다 (EAFP).

OP는 논평을 통해 그들의 사용 사례에 대해 인덱스가 무엇인지 아는 것이 실제로 중요하지 않다고 명확히 설명했습니다.승된답노로트변사, 용인용을 합니다.x in somelist당신이 신경쓰지 않는다면 가장 좋은 대답입니다.

하지만 원래 질문에서 알 수 있듯이, 지수가 무엇인지 신경 쓴다고 가정하겠습니다.이 경우 다른 모든 솔루션은 목록을 두 번 검색해야 하므로 성능 저하가 클 수 있습니다.

게다가, 존경하는 레이먼드 헤팅거가 논평에서 말했듯이.

리스트가 있어도요.반환된 a -1을 찾아서 i == -1인지 확인하고 어떤 조치를 취해야 합니다.

그래서 저는 예외를 피해야 한다는 원래 질문의 가정을 뒤로 미루겠습니다.저는 예외가 당신의 친구라고 제안합니다.그들은 겁낼 것도 없고, 비효율적이지도 않으며, 사실 좋은 코드를 작성하기 위해서는 그들과 잘 통해야 합니다.

그래서 제 생각에 가장 좋은 답은 단순히 예외적인 접근법을 사용하는 것입니다.

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

"처리"는 단지 당신이 해야 할 일을 하는 것을 의미합니다: 그것을 센티널 값으로 설정하고, 당신 자신의 예외를 제기하고, 다른 코드 분기를 따르는 것 등.

이것은 Python 원칙의 예입니다. EAFP(허가보다 용서를 구하는 것이 더 쉽다)는 것은 if-then-else 스타일의 도약 전에 보기(LCIL)와 대조적입니다.

필요한 작업을 수행하는 기능을 작성합니다.

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하지만 그것은 당신이 적합하다고 생각하는 모든 것이 될 수 있습니다.).

시퀀스의 위치와 존재 여부에 상관없이 다음을 사용합니다.in교환입니다.그렇지 않으면 예외 처리를 리팩터링하는 함수를 작성합니다.

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

글루온 패키지의 스토리지 모듈에 있는 Web2py's List 클래스를 사용하고 싶습니다.저장 모듈은 요소를 찾을 수 없을 때 오류가 발생하지 않는 목록과 사전과 같은(저장) 데이터 구조를 제공합니다.

먼저 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

당신이 하고 싶은 일을 할 수 있는 내장된 방법은 없습니다.

다음은 도움이 될 수 있는 좋은 게시물입니다.목록에 사전과 같은 안전한 "취득" 방법이 없는 이유는 무엇입니까?

이것이 도움이 되길 바랍니다.

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

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

반응형