[python] 첫 번째 항목을 반환하는 Python 관용구 또는 없음

나에게 일어나지 않는 간단한 방법이 있다고 확신합니다.

목록을 반환하는 많은 메소드를 호출하고 있습니다. 목록이 비어있을 수 있습니다. 목록이 비어 있지 않으면 첫 번째 항목을 반환하고 싶습니다. 그렇지 않으면 None을 반환하고 싶습니다. 이 코드는 작동합니다 :

my_list = get_list()
if len(my_list) > 0: return my_list[0]
return None

나는 이것을하기위한 간단한 한 줄의 관용구가 있어야하는 것처럼 보이지만, 내 삶을 위해 나는 그것을 생각할 수 없다. 있습니까?

편집하다:

여기서 한 줄짜리 식을 찾고있는 이유는 엄청나게 간결한 코드를 좋아하지 않기 때문에 다음과 같은 많은 코드를 작성해야하기 때문입니다.

x = get_first_list()
if x:
    # do something with x[0]
    # inevitably forget the [0] part, and have a bug to fix
y = get_second_list()
if y:
    # do something with y[0]
    # inevitably forget the [0] part AGAIN, and have another bug to fix

내가하고 싶은 일은 분명히 기능을 통해 달성 될 수 있습니다 (아마도 가능할 것입니다).

def first_item(list_or_none):
    if list_or_none: return list_or_none[0]

x = first_item(get_first_list())
if x:
    # do something with x
y = first_item(get_second_list())
if y:
    # do something with y

파이썬에서 간단한 표현식이 할 수있는 일에 자주 놀랐 기 때문에 질문을 게시했으며 간단한 표현식이 있으면 트릭을 수행 할 수있는 경우 함수를 작성하는 것이 어리석은 일이라고 생각했습니다. 그러나 이러한 답변을 보면 함수 간단한 솔루션 인 것 같습니다 .



답변

파이썬 2.6 이상

next(iter(your_list), None)

만약 your_list할 수 있습니다 None:

next(iter(your_list or []), None)

파이썬 2.4

def get_first(iterable, default=None):
    if iterable:
        for item in iterable:
            return item
    return default

예:

x = get_first(get_first_list())
if x:
    ...
y = get_first(get_second_list())
if y:
    ...

다른 옵션은 위 함수를 인라인하는 것입니다.

for x in get_first_list() or []:
    # process x
    break # process at most one item
for y in get_second_list() or []:
    # process y
    break

피할 break수 있습니다 :

for x in yield_first(get_first_list()):
    x # process x
for y in yield_first(get_second_list()):
    y # process y

어디:

def yield_first(iterable):
    for item in iterable or []:
        yield item
        return


답변

가장 좋은 방법은 다음과 같습니다.

a = get_list()
return a[0] if a else None

한 줄로도 할 수 있지만 프로그래머가 읽기가 훨씬 어렵습니다.

return (get_list()[:1] or [None])[0]


답변

(get_list() or [None])[0]

작동합니다.

BTW list내장 변수 를 덮어 쓰기 때문에 변수를 사용하지 않았습니다 list().

편집 : 나는 조금 더 간단하지만 여기서 잘못된 버전을 가지고있었습니다.


답변

가장 파이썬적인 관용적 방법은 list가 iterable 이기 때문에 iterator에서 next ()를 사용하는 것 입니다. @JFSebastian이 2011 년 12 월 13 일 코멘트에 언급 한 것과 같습니다.

next(iter(the_list), None)the_list비어 있으면 None을 반환합니다 . 참조 다음 () 파이썬 2.6+

또는 the_list비어 있지 않다는 것을 알고 있다면 :

iter(the_list).next()iterator.next () 참조 파이썬 2.2 이상


답변

목록 이해에서 첫 번째 항목 (또는 없음)을 뽑으려고하는 경우 발전기로 전환하여 다음과 같이 할 수 있습니다.

next((x for x in blah if cond), None)

장점 : blah를 색인 할 수없는 경우 작동합니다. Con : 익숙하지 않은 구문입니다. ipython에서 해킹하고 필터링하는 동안 유용합니다.


답변

OP의 솔루션은 거의 거기에 있으며 Pythonic을 더 만들려면 몇 가지가 있습니다.

하나, 목록의 길이를 얻을 필요가 없습니다. 파이썬에서 빈 목록은 if 검사에서 False로 평가됩니다. 간단히 말해

if list:

또한 예약어와 겹치는 변수에 할당하는 것은 매우 나쁜 생각입니다. “list”는 파이썬에서 예약 된 단어입니다.

그래서 그것을

some_list = get_list()
if some_list:

여기서 많은 솔루션이 놓친 정말 중요한 점은 모든 Python 함수 / 메소드가 기본적으로 None을 반환 한다는 입니다. 아래에서 다음을 시도하십시오.

def does_nothing():
    pass

foo = does_nothing()
print foo

함수를 조기에 종료하기 위해 None을 반환하지 않는 한 명시 적으로 None을 반환 할 필요는 없습니다. 간결하게, 첫 번째 항목을 반환하십시오.

some_list = get_list()
if some_list:
    return list[0]

마지막으로, 이것은 아마도 암시 적이지만 명시 적이어야합니다 (명시 적이 암시 적보다 낫기 때문에 ) 함수가 다른 함수에서 목록을 얻지 않아야합니다. 그냥 매개 변수로 전달하십시오. 최종 결과는

def get_first_item(some_list):
    if some_list:
        return list[0]

my_list = get_list()
first_item = get_first_item(my_list)

내가 말했듯이 OP는 거의 거기에 있었고 몇 번의 터치만으로 원하는 Python 풍미를 얻을 수 있습니다.


답변

for item in get_list():
    return item