if 문을 사용한 목록 이해


106

2 개의 이터 러블을 비교하고 두 이터 러블에 나타나는 항목을 인쇄하고 싶습니다.

>>> a = ('q', 'r')
>>> b = ('q')


# Iterate over a. If y not in b, print y.
# I want to see ['r'] printed.
>>> print([ y if y not in b for y in a])
                              ^

그러나이 위치에 잘못된 구문 오류가 발생합니다 ^. 이 람바 함수의 문제점은 무엇입니까?


5
아래의 모든 답변은 맞지만 b = ('q')튜플을 생성하지도 않습니다. 하나의 요소가있는 튜플은 명시 적 ,, 즉b = ('q',)
dmg

나는 변경 tuples으로 iterables.
OrangeTux 2013 년

답변:


187

주문이 잘못되었습니다. 이 if뒤에 있어야합니다 for( if-else삼항 연산자 에 있지 않는 한 ).

[y for y in a if y not in b]

그러나 이것은 작동합니다.

[y if y not in b else other_value for y in a]

감사. 나는 람다 함수의 if else 문에 대한 이 포스트 stackoverflow.com/questions/4406389/…를 보았습니다 . 그리고 if 문만 (else없이) 사용하면 같은 순서로 작동 할 것이라고 생각했습니다.
OrangeTux

39

당신은 if끝에 넣습니다 .

[y for y in a if y not in b]

목록 이해는 중첩 된 전체 지정 대응과 동일한 순서로 작성되며 기본적으로 위의 명령문은 다음과 같이 변환됩니다.

outputlist = []
for y in a:
    if y not in b:
        outputlist.append(y)

귀하의 버전이 대신 이것을 시도했습니다.

outputlist = []
if y not in b:
    for y in a:
        outputlist.append(y)

그러나 목록 이해 적어도 하나의 외부 루프로 시작 해야합니다 .


당신은 매우 도움이되었습니다. 감사합니다.
Tolgahan ÜZÜN

7

목록 이해 공식 :

[<value_when_condition_true> if <condition> else <value_when_condition_false> for value in list_name]

따라서 다음과 같이 할 수 있습니다.

[y for y in a if y not in b]

시연 목적으로 만 : [y가 b에 없으면 y가 그렇지 않으면 a에 y가 거짓]


2
당신은 else적어도 하나를 넣는 곳이 아니라 목록 이해력에 넣을 수 없습니다 . 목록 이해 (필터링)를 조건식 (값이 있어야하며 else 식을 필수로 함)과 혼동하지 마십시오.
Martijn Pieters

동의하다. else코드에 표시된대로 목록 이해에 사용됩니다.
Vishvajit Pathak

2
그것은 조건식 입니다. 유효한 표현식이 적용되는 모든 곳에서 사용할 수 있습니다. 목록 이해력에만 국한되지 않습니다.
Martijn Pieters

5

이것은 람다 함수가 아닙니다. 목록 이해입니다.

순서를 변경하십시오.

[ y for y in a if y not in b]

-2

아래에 설명 된대로 내 상황에 대한 목록 이해에 대한 위에서 언급 한 제안을 조사하고 시도했지만 작동하지 않았습니다. 내가 여기서 뭘 잘못하고 있니?

sent_splt=[['good', 'case,', 'excellent', 'value.'], ['great', 'for', 'the', 'jawbone.'],['tied', 'to', 'charger', 'for', 'conversations', 'lasting', 'more', 'than', '45', 'minutes.major', 'problems!!']]

stop_set = ['the', 'a', 'an', 'i', 'he', 'she', 'they', 'to', 'of', 'it', 'from']

x=[a for a in sent_splt if a not in stop_set]
print(x)

단어를 필터링하지 않습니다.


1
당신이해야 할 일은 질문을하는 것입니다. 답변을 게시하지 마십시오.
Whirl Mind

사실 저를 위해 지난 2 일에서 1 일 휴식 후에 질문을 게시하는 것입니다. 기본적으로 stackoverflow 표준에 따르지 않은 이전 질문 때문에 질문을 게시 할 수 없습니다. 불편을 드려 죄송합니다.
Deepak Dhiman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.