[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



답변

궁극적으로 .geta 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'


답변

jose.angel.jimenez의 크레딧


“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')