[python] 왜리스트에 사전과 같은 안전한 “get”메소드가 없는가?
왜리스트에 사전과 같은 안전한 “get”메소드가 없는가?
>>> d = {'a':'b'}
>>> d['a']
'b'
>>> d['c']
KeyError: 'c'
>>> d.get('c', 'fail')
'fail'
>>> l = [1]
>>> l[10]
IndexError: list index out of range
답변
궁극적으로 .get
a dict
는 예외가 발생하지 않고 키가 있는지 확인하고 값을 반환하는 것이 비효율적 인 연관 컬렉션 (값과 이름이 연관되어 있음) 이기 때문에 아마도 안전한 방법 이 없을 것입니다. len
메소드가 매우 빠르기 때문에 목록 요소에 액세스하는 예외를 피하기 위해 . 이 .get
방법을 사용하면 사전에서 37 번째 항목에 직접 액세스하지 않고 이름과 관련된 값을 쿼리 할 수 있습니다 (목록에서 요구하는 것과 더 유사 함).
물론 이것을 직접 구현할 수 있습니다.
def safe_list_get (l, idx, default):
try:
return l[idx]
except IndexError:
return default
의 __builtins__.list
생성자에 monkeypatch 할 수도 __main__
있지만 대부분의 코드에서 사용하지 않기 때문에 덜 널리 퍼질 것입니다. 이 코드를 자신의 코드로 만든 목록과 함께 사용하려면 하위 클래스를 작성 list
하고 get
메소드를 추가하면 됩니다.
답변
첫 번째 요소를 원하면 작동합니다. my_list.get(0)
>>> my_list = [1,2,3]
>>> next(iter(my_list), 'fail')
1
>>> my_list = []
>>> next(iter(my_list), 'fail')
'fail'
나는 그것이 당신이 요구 한 것이 아니라 다른 사람들을 도울 수 있다는 것을 알고 있습니다.
답변
아마도 목록 의미론에는 그다지 의미가 없기 때문일 것입니다. 그러나 서브 클래 싱을 통해 쉽게 자신 만의 것을 만들 수 있습니다.
class safelist(list):
def get(self, index, default=None):
try:
return self.__getitem__(index)
except IndexError:
return default
def _test():
l = safelist(range(10))
print l.get(20, "oops")
if __name__ == "__main__":
_test()
답변
.get을 사용하는 대신 목록을 사용하는 것이 좋습니다. 사용법 차이입니다.
>>> l = [1]
>>> l[10] if 10 < len(l) else 'fail'
'fail'
답변
이 시도:
>>> i = 3
>>> a = [1, 2, 3, 4]
>>> next(iter(a[i:]), 'fail')
4
>>> next(iter(a[i + 1:]), 'fail')
'fail'
답변
“oneliner”팬들을 위해…
목록의 첫 번째 요소를 원하거나 목록이 비어있는 경우 기본값을 원하면 다음을 시도하십시오.
liste = ['a', 'b', 'c']
value = (liste[0:1] or ('default',))[0]
print(value)
보고 a
과
liste = []
value = (liste[0:1] or ('default',))[0]
print(value)
보고 default
다른 요소의 예…
liste = ['a', 'b', 'c']
print(liste[0:1]) # returns ['a']
print(liste[1:2]) # returns ['b']
print(liste[2:3]) # returns ['c']
기본 폴백으로…
liste = ['a', 'b', 'c']
print((liste[0:1] or ('default',))[0]) # returns a
print((liste[1:2] or ('default',))[0]) # returns b
print((liste[2:3] or ('default',))[0]) # returns c
테스트 Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13)
답변
가장 좋은 방법은 목록을 dict로 변환 한 다음 get 메소드로 액세스하는 것입니다.
>>> my_list = ['a', 'b', 'c', 'd', 'e']
>>> my_dict = dict(enumerate(my_list))
>>> print my_dict
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'}
>>> my_dict.get(2)
'c'
>>> my_dict.get(10, 'N/A')