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
intersection
set
>>> 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.7
및 python3.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
'IT story' 카테고리의 다른 글
Java에서 해시 맵을 JSON 객체로 변환하는 방법 (0) | 2020.04.10 |
---|---|
스크립트 순서로드 및 실행 (0) | 2020.04.09 |
ValueError : 기본 10 인 int ()에 대한 잘못된 리터럴 : '' (0) | 2020.04.09 |
요소에 BOTH 클래스가있는 경우에만 적용 할 CSS 규칙 (0) | 2020.04.09 |
Vim의 설정 파일에서“.vimrc”를 주석으로 처리하는 방법은 무엇입니까? (0) | 2020.04.09 |