[python] FOR 루프와 IF 문을 결합하는 파이썬 방식

for 루프와 if 문을 별도의 줄에 사용하는 방법을 알고 있습니다.

>>> a = [2,3,4,5,6,7,8,9,0]
... xyz = [0,12,4,6,242,7,9]
... for x in xyz:
...     if x in a:
...         print(x)
0,4,6,7,9

그리고 나는 다음과 같이 진술이 간단 할 때 목록 이해를 사용하여 이들을 결합 할 수 있다는 것을 알고 있습니다.

print([x for x in xyz if x in a])

그러나 내가 찾을 수없는 것은 for 루프와 if 문을 조합하여 발생하는 복잡한 명령 세트 ( “print x”뿐만 아니라)를 보여주는 어디에서나 (복사하고 배울 수있는) 좋은 예입니다. 내가 기대할만한 것 :

for x in xyz if x not in a:
    print(x...)

이것은 파이썬이 작동하는 방식이 아닙니까?



답변

다음 과 같이 생성기 표현식을 사용할 수 있습니다 .

gen = (x for x in xyz if x not in a)

for x in gen:
    print x


답변

당으로 파이썬의 선 (당신은 당신의 코드, 즉 갈 수있는 곳 “파이썬”인지 궁금해하는 경우)

  • 못생긴 것보다 아름답습니다.
  • 암시적인 것보다 명시적인 것이 좋습니다.
  • 단순함이 복잡한 것보다 낫습니다.
  • 평평한 것이 중첩보다 낫습니다.
  • 가독성이 중요합니다.

두 가지 를 얻는 Pythonic 방법 은 다음과 같습니다.sorted intersectionset

>>> sorted(set(a).intersection(xyz))
[0, 4, 6, 7, 9]

또는 포함 xyz되지 않은 요소 a:

>>> sorted(set(xyz).difference(a))
[12, 242]

그러나 더 복잡한 루프의 경우 이름이 지정된 생성기 표현식 을 반복하고 이름이 지정된 함수를 호출하여 루프를 평평하게 할 수 있습니다. 한 줄에 모든 것을 맞추려고하는 것은 “피 토닉”이 아닙니다.


질문에 대한 추가 의견과 허용 된 답변에 따라 업데이트

나는 당신이 무엇을하려고하는지 확실하지 enumerate않지만 a, 사전 이라면 다음과 같이 키를 사용하고 싶을 것입니다.

>>> a = {
...     2: 'Turtle Doves',
...     3: 'French Hens',
...     4: 'Colly Birds',
...     5: 'Gold Rings',
...     6: 'Geese-a-Laying',
...     7: 'Swans-a-Swimming',
...     8: 'Maids-a-Milking',
...     9: 'Ladies Dancing',
...     0: 'Camel Books',
... }
>>>
>>> xyz = [0, 12, 4, 6, 242, 7, 9]
>>>
>>> known_things = sorted(set(a.iterkeys()).intersection(xyz))
>>> unknown_things = sorted(set(xyz).difference(a.iterkeys()))
>>>
>>> for thing in known_things:
...     print 'I know about', a[thing]
...
I know about Camel Books
I know about Colly Birds
I know about Geese-a-Laying
I know about Swans-a-Swimming
I know about Ladies Dancing
>>> print '...but...'
...but...
>>>
>>> for thing in unknown_things:
...     print "I don't know what happened on the {0}th day of Christmas".format(thing)
...
I don't know what happened on the 12th day of Christmas
I don't know what happened on the 242th day of Christmas


답변

나는 개인적으로 이것이 가장 예쁜 버전이라고 생각합니다.

a = [2,3,4,5,6,7,8,9,0]
xyz = [0,12,4,6,242,7,9]
for x in filter(lambda w: w in a, xyz):
  print x

편집하다

람다를 사용하지 않으려는 경우 부분 기능 응용 프로그램을 사용하고 연산자 모듈 (대부분의 연산자 기능을 제공함)을 사용할 수 있습니다.

https://docs.python.org/2/library/operator.html#module-operator

from operator import contains
from functools import partial
print(list(filter(partial(contains, a), xyz)))


답변

다음은 허용 된 답변의 단순화 / 한 라이너입니다.

a = [2,3,4,5,6,7,8,9,0]
xyz = [0,12,4,6,242,7,9]

for x in (x for x in xyz if x not in a):
    print(x)

12
242

(가) 통지 generator유지 인라인 . 이 테스트되었다 python2.7python3.6 합니다 (에 괄호를 알 print;))


답변

아마 사용할 것입니다 :

for x in xyz:
    if x not in a:
        print x...


답변

a = [2,3,4,5,6,7,8,9,0]
xyz = [0,12,4,6,242,7,9]
set(a) & set(xyz)
set([0, 9, 4, 6, 7])


답변

당신이 사용할 수있는 발전기 발전기 표현이 너무 복잡하거나 복잡한 될 경우, 너무 :

def gen():
    for x in xyz:
        if x in a:
            yield x

for x in gen():
    print x