나에게 일어나지 않는 간단한 방법이 있다고 확신합니다.
목록을 반환하는 많은 메소드를 호출하고 있습니다. 목록이 비어있을 수 있습니다. 목록이 비어 있지 않으면 첫 번째 항목을 반환하고 싶습니다. 그렇지 않으면 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