IT story

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

hot-time 2020. 4. 9. 08:11
반응형

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;))


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])

아마 사용할 것입니다 :

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

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

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

for x in gen():
    print x

사용 intersection또는intersection_update

  • 교차로 :

    a = [2,3,4,5,6,7,8,9,0]
    xyz = [0,12,4,6,242,7,9]
    ans = sorted(set(a).intersection(set(xyz)))
    
  • section_update :

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

    그럼 b네 대답은


내가 좋아하는 알렉스의 답변을 때문에, 필터가 정확하게 인 경우 목록에 적용되므로이 조건을 주어진 목록의 하위 집합을 탐구하려는 경우,이 가장 자연스러운 방법이 될 것 같습니다,

mylist = [1,2,3,4,5]
another_list = [2,3,4]

wanted = lambda x:x in another_list

for x in filter(wanted, mylist):
    print(x)

이 방법은 우려의 분리에 유용합니다. 조건 함수가 변경되면 피처링 할 유일한 코드는 함수 자체입니다.

mylist = [1,2,3,4,5]

wanted = lambda x:(x**0.5) > 10**0.3

for x in filter(wanted, mylist):
    print(x)

발전기 방법을 사용하면 목록의 구성원을하지 않을 경우 더 나은 것 같다,하지만 더 맞는 것 같다 고 말했다 구성원의 변경, 발전기

mylist = [1,2,3,4,5]

wanted = lambda x:(x**0.5) > 10**0.3

generator = (x**0.5 for x in mylist if wanted(x))

for x in generator:
    print(x)

또한 필터는 발전기와 작동하지만이 경우 효율적이지 않습니다.

mylist = [1,2,3,4,5]

wanted = lambda x:(x**0.5) > 10**0.3

generator = (x**0.9 for x in mylist)

for x in filter(wanted, generator):
    print(x)

그러나 물론 다음과 같이 작성하는 것이 좋습니다.

mylist = [1,2,3,4,5]

wanted = lambda x:(x**0.5) > 10**0.3

# for x in filter(wanted, mylist):
for x in mylist if wanted(x):
    print(x)

참고 URL : https://stackoverflow.com/questions/6981717/pythonic-way-to-combine-for-loop-and-if-statement

반응형