목록 이해에 'else'를 사용할 수 있습니까? [복제]
이 질문에는 이미 답변이 있습니다.
- 목록 이해에 있다면? 답변 8 개
다음은 목록 이해로 바꾸려는 코드입니다.
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 c
은 a
조건 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
'Programming' 카테고리의 다른 글
Entity Framework 6 코드 첫 번째 기본값 (0) | 2020.05.16 |
---|---|
jQuery append ()-추가 된 요소 반환 (0) | 2020.05.16 |
XDocument를 XmlDocument로 또는 그 반대로 변환 (0) | 2020.05.16 |
ExecutorService, 모든 작업이 완료 될 때까지 기다리는 방법 (0) | 2020.05.16 |
Microsoft Excel에서 .csv 파일의 분음 부호를 표시합니까? (0) | 2020.05.16 |