Python에서 범위를 벗어난 인덱스 기본값 가져오기
a = ['123', '2', 4]
b = a[4] or 'sss'
print b
목록 인덱스가 범위를 벗어날 때 기본값을 가져오고 싶다(여기:'sss'
).
이거 어떻게 해?
"허가가 아닌 용서를 구한다"는 Python 정신에서 한 가지 방법은 다음과 같습니다.
try:
b = a[4]
except IndexError:
b = 'sss'
"용서가 아닌 허락을 구하라"는 비피톤 정신에서, 다른 방법은 다음과 같습니다.
b = a[4] if len(a) > 4 else 'sss'
Python의 아름다운 정신은 못생긴 것보다 낫다.
슬라이스 및 언팩을 사용하는 코드 골프 방식(4년 전에 유효한지는 모르겠지만 파이썬 2.7 + 3.3)
b, = a[4:5] or ['sss']
래퍼 기능이나 IMHO의 트라이캐치보다 좋지만, 초보자에게는 위협적입니다.
개봉하지 않고 슬라이스 사용:
b = a[4] if a[4:] else 'sss'
또는 만약 당신이 이것을 자주 해야 한다면, 그리고 사전을 만드는 것을 꺼려하지 않는다.
d = dict(enumerate(a))
b = d.get(4, 'sss')
다른 방법:
b = (a[4:]+['sss'])[0]
독자적인 리스트 클래스를 작성할 수 있습니다.
class MyList(list):
def get(self, index, default=None):
return self[index] if -len(self) <= index < len(self) else default
다음과 같이 사용할 수 있습니다.
>>> l = MyList(['a', 'b', 'c'])
>>> l.get(1)
'b'
>>> l.get(9, 'no')
'no'
첫 번째 요소를 원하는 일반적인 경우 다음과 같이 할 수 있습니다.
next(iter([1, 2, 3]), None)
목록을 필터링한 후 "포장 해제"하기 위해 사용합니다.
next((x for x in [1, 3, 5] if x % 2 == 0), None)
또는
cur.execute("SELECT field FROM table")
next(cur.fetchone(), None)
또, 다음의 경우에 대해서, 도우미 기능을 정의할 수도 있습니다.
def default(x, e, y):
try:
return x()
except e:
return y
함수의 반환 값을 반환합니다.x
(유형의 예외가 발생하지 않는 한)e
; 이 경우 값을 반환합니다.y
사용방법:
b = default(lambda: a[4], IndexError, 'sss')
편집: 지정된 유형의 예외만 탐지합니다.
개선을 위한 제안은 여전히 환영입니다!
try:
b = a[4]
except IndexError:
b = 'sss'
보다 깔끔한 방법(dict를 사용하는 경우에만 사용 가능):
b = a.get(4,"sss") # exact same thing as above
다음은 사용자가 원하는 다른 방법입니다(다시 말씀드리지만, 딕트 전용).
b = a.setdefault(4,"sss") # if a[4] exists, returns that, otherwise sets a[4] to "sss" and returns "sss"
허락을 구하는 것에 전적으로 찬성합니다(즉, 저는 그 허락을 받는 것을 좋아하지 않습니다).try
…except
메서드).단, 다음과 같은 방법으로 캡슐화하면 코드가 훨씬 깨끗해집니다.
def get_at(array, index, default):
if index < 0: index += len(array)
if index < 0: raise IndexError('list index out of range')
return array[index] if index < len(a) else default
b = get_at(a, 4, 'sss')
인덱스 연산자에서 기본값을 가져올 수 있는 유지 관리 가능한 방법을 찾는 경우 다음 사항이 유용합니다.
덮어쓰면operator.getitem
연산자 모듈에서 옵션 기본 파라미터를 추가하면 하위 호환성을 유지하면서 원래 파라미터와 동일한 동작을 얻을 수 있습니다.
def getitem(iterable, index, default=None):
import operator
try:
return operator.getitem(iterable, index)
except IndexError:
return default
코드 길이를 특징적으로 줄일 수 있는 빠른 해킹을 찾고 있다면, 이것을 시도해 볼 수 있습니다.
a=['123','2',4]
a.append('sss') #Default value
n=5 #Index you want to access
max_index=len(a)-1
b=a[min(max_index, n)]
print(b)
그러나 이 트릭은 목록을 더 이상 수정하지 않을 때만 유용합니다.
이것은 구글의 최고 히트작이기 때문에, 표준적인 "컬렉션" 패키지에 이 문제에 대한 보다 유연한 해결책을 제공하는 "defaultdict"가 있다는 것도 언급할 가치가 있을 것이다.
예를 들어 다음과 같은 깔끔한 작업을 수행할 수 있습니다.
twodee = collections.defaultdict(dict)
twodee["the horizontal"]["the vertical"] = "we control"
상세내용 : http://docs.python.org/2/library/collections.html
try/catch 사용?
try:
b=a[4]
except IndexError:
b='sss'
언급URL : https://stackoverflow.com/questions/2574636/getting-a-default-value-on-index-out-of-range-in-python
'programing' 카테고리의 다른 글
Go에서 int 값을 문자열로 변환하려면 어떻게 해야 합니까? (0) | 2023.04.16 |
---|---|
단일 인스턴스 WPF 응용 프로그램을 만드는 올바른 방법은 무엇입니까? (0) | 2023.04.16 |
개인 API를 사용하지 않고 현재 첫 번째 응답자를 가져옵니다. (0) | 2023.04.16 |
Git 커밋의 출처를 특정하다 (0) | 2023.04.16 |
Windows용 Objective-C (0) | 2023.04.11 |