Programming

목록 이해에 'else'를 사용할 수 있습니까?

procodes 2020. 5. 16. 11:27
반응형

목록 이해에 'else'를 사용할 수 있습니까? [복제]


이 질문에는 이미 답변이 있습니다.

다음은 목록 이해로 바꾸려는 코드입니다.

table = ''
for index in xrange(256):
    if index in ords_to_keep:
        table += chr(index)
    else:
        table += replace_with

이 이해에 else 문을 추가하는 방법이 있습니까?

table = ''.join(chr(index) for index in xrange(15) if index in ords_to_keep)

구문 a if b else ca조건 b이 참 인지 평가하는 파이썬의 삼항 연산자입니다 c. 그렇지 않으면로 평가됩니다 . 이해 문에서 사용할 수 있습니다.

>>> [a if a else 2 for a in [0,1,0,3]]
[2, 1, 2, 3]

예를 들어,

table = ''.join(chr(index) if index in ords_to_keep else replace_with
                for index in xrange(15))

당신이 원한다면 else당신은 지능형리스트를 필터링하지 않으려는, 당신은 모든 값을 반복으로합니다. true-value if cond else false-value대신 명령문으로 사용하고 끝에서 필터를 제거 할 수 있습니다 .

table = ''.join(chr(index) if index in ords_to_keep else replace_with for index in xrange(15))

else파이썬 프로그래밍에서 인리스트 이해 를 사용하려면 아래 스 니펫을 사용해보십시오. 이것은 문제를 해결할 것입니다. 스 니펫은 python 2.7 및 python 3.5에서 테스트되었습니다.

obj = ["Even" if i%2==0 else "Odd" for i in range(10)]

, else돌며 파이썬에서 사용할 수있는 이해 A를 조건식 ( "삼항 연산자") :list

>>> [("A" if b=="e" else "c") for b in "comprehension"]
['c', 'c', 'c', 'c', 'c', 'A', 'c', 'A', 'c', 'c', 'c', 'c', 'c']

여기서 괄호 "()"는 조건식을 강조하기위한 것일뿐, 반드시 필요한 것은 아닙니다 ( 연산자 우선 순위 ).

또한 여러 표현식을 중첩 else하여 코드를 더 읽기 어렵게 만들 수 있습니다.

>>> ["A" if b=="e" else "d" if True else "x" for b in "comprehension"]
['d', 'd', 'd', 'd', 'd', 'A', 'd', 'A', 'd', 'd', 'd', 'd', 'd']
>>>

관련 메모에서 이해도 if끝에 자체 조건이 포함될 수 있습니다 .

>>> ["A" if b=="e" else "c" for b in "comprehension" if False]
[]
>>> ["A" if b=="e" else "c" for b in "comprehension" if "comprehension".index(b)%2]
['c', 'c', 'A', 'A', 'c', 'c']

조건 ? 예, 여러 if개가 가능하며 실제로 여러 for개도 가능합니다 .

>>> [i for i in range(3) for _ in range(3)]
[0, 0, 0, 1, 1, 1, 2, 2, 2]
>>> [i for i in range(3) if i for _ in range(3) if _ if True if True]
[1, 1, 2, 2]

(단일 밑줄 _파이썬에서 유효한 변수 이름 ( 식별자 )이며 실제로 사용되지 않음 을 나타 내기 위해 여기에 사용됩니다 . 대화 형 모드에서 특별한 의미가 있습니다 )

추가 조건식에 이것을 사용하는 것은 가능하지만 실제로 사용되지는 않습니다.

>>> [i for i in range(3)]
[0, 1, 2]
>>> [i for i in range(3) if i]
[1, 2]
>>> [i for i in range(3) if (True if i else False)]
[1, 2]

이해도를 중첩하여 "다차원"목록 ( "배열")을 만들 수 있습니다.

>>> [[i for j in range(i)] for i in range(3)]
[[], [1], [2, 2]]

마지막으로, 이해력이 창조에 제한되지 아니 하나 list, 즉 else하고 if또한 동일한 방법으로 사용할 수 있습니다 set이해를 :

>>> {i for i in "set comprehension"}
{'o', 'p', 'm', 'n', 'c', 'r', 'i', 't', 'h', 'e', 's', ' '}

그리고 dictionary이해 :

>>> {k:v for k,v in [("key","value"), ("dict","comprehension")]}
{'key': 'value', 'dict': 'comprehension'}

생성기 표현식 에도 동일한 구문이 사용됩니다 .

>>> for g in ("a" if b else "c" for b in "generator"):
...     print(g, end="")
...
aaaaaaaaa>>>

을 만드는 데 사용할 수 있습니다 tuple( 튜플 이해가 없음 ).


더 읽을 거리 :


훌륭한 답변이지만 "pass"키워드가 목록 이해의 if / else 부분에서 작동하지 않는다는 점을 언급하고 싶었습니다 (위의 예에 게시 됨).

#works
list1 = [10, 20, 30, 40, 50]
newlist2 = [x if x > 30 else x**2 for x in list1 ]
print(newlist2, type(newlist2))

#but this WONT work
list1 = [10, 20, 30, 40, 50]
newlist2 = [x if x > 30 else pass for x in list1 ]
print(newlist2, type(newlist2))

이것은 파이썬 3.4에서 시도되고 테스트되었습니다. 오류는 다음과 같습니다.

newlist2 = [x if x > 30 else pass for x in list1 ]                                    
SyntaxError: invalid syntax

따라서 목록 이해에서 통과를 피하십시오.


또한 목록 이해가 가장 효율적인 방법이라고 결론 내릴 수 있습니까?

아마도. 리스트 이해는 본질적으로 계산적으로 효율적이지 않습니다. 여전히 선형 시간으로 실행 중입니다.

From my personal experience: I have significantly reduced computation time when dealing with large data sets by replacing list comprehensions (specifically nested ones) with for-loop/list-appending type structures you have above. In this application I doubt you will notice a difference.

참고URL : https://stackoverflow.com/questions/2951701/is-it-possible-to-use-else-in-a-list-comprehension

반응형