목록 이해력에 권한이 있습니까?
어디에 있습니까?
row = [unicode(x.strip()) for x in row if x is not None else '']
본질적으로 :
- 모든 없음을 빈 곳으로 바꾼 다음
- 기능을 수행하십시오.
당신은 완전히 할 수 있습니다, 그것은 단지 주문 문제입니다.
[unicode(x.strip()) if x is not None else '' for x in row]
일반적으로
[f(x) if condition else g(x) for x in sequence]
그리고 if
보기 조건 만있는 목록 이해의 경우
[f(x) for x in sequence if condition]
이것은 실제로 다른 언어 구조 인 조건식 을 사용하는데, 이는 자체가 이해 구문의 일부 가 아닌 반면 if
이후는 for…in
목록 이해의 일부이며 소스 반복이 가능한 요소 를 필터링 하는 데 사용 됩니다.
조건식은 일부 조건에 따라 두 식 값 선택하려는 모든 종류의 상황에서 사용할 수 있습니다. 이것은 다른 언어에 존재 하는 삼항 연산자?:
와 동일 합니다 . 예를 들면 :
value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')
일방 통행 :
def change(f):
if f is None:
return unicode(f.strip())
else:
return ''
row = [change(x) for x in row]
그래도 다음이 있습니다.
row = map(change, row)
또는 람다 인라인을 사용할 수 있습니다.
다음은 또 다른 예시입니다.
>>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!")
Ha, ha, ha!
에 의해 생성 함수 된 다른 모든 값 에 대해 대한 및에 로 if i
평가 되는 사실을 이용합니다 . 이해력은 다음과 같이 평가됩니다.False
0
True
range()
>>> ["ha" if i else "Ha" for i in range(3)]
['Ha', 'ha', 'ha']
특정 문제는 이전 답변에서 이미 해결 된 문제는 목록 이해 내에서 조건문을 사용하는 일반적인 아이디어를 다룰 것입니다.
다음은 목록 이해력 내에서 조건문을 작성하는 방법을 예입니다.
X = [1.5, 2.3, 4.4, 5.4, 'n', 1.5, 5.1, 'a'] # Original list
# Extract non-strings from X to new list
X_non_str = [el for el in X if not isinstance(el, str)] # When using only 'if', put 'for' in the beginning
# Change all strings in X to 'b', preserve everything else as is
X_str_changed = ['b' if isinstance(el, str) else el for el in X] # When using 'if' and 'else', put 'for' in the end
에 대한 첫 번째 목록 이해 X_non_str
에서 순서는 다음과 같습니다.
반복 가능한 if 조건의 항목 에 대한 표현식
에 대한 마지막 목록 이해 X_str_changed
에서 순서는 다음과 같습니다.
expression1이 경우 조건에 다른 사람 이 expression2 에 대한 항목 에서 반복 가능한
나는 항상 expresseion1 은 if 앞에 있어야 하고 expression2 는 else 뒤에 있어야 한다는 것을 기억하기 어렵습니다 . 내 머리는 둘 다 전후에 있기를 원합니다.
나는 그것이 설계 추측과 같은 정상적인 언어, 예를 들어 유사하기 때문에 "나는 내 체류하려는 경우 비가를, 다른 나는 외부 가고 싶어"
다른 솔루션은 단일 if
/ else
구성에 적합합니다. 그러나 목록 내포 내의 삼 항문은 읽기가 어렵습니다.
함수를 사용하면 가독성이 향상되지만 매핑이 입력 인 워크 플로에서 이러한 솔루션을 확장하거나 적용하기가 어렵습니다. 사전은 이러한 문제를 완화 할 수 있습니다.
row = [None, 'This', 'is', 'a', 'filler', 'test', 'string', None]
d = {None: '', 'filler': 'manipulated'}
res = [d.get(x, x) for x in row]
print(res)
['', 'This', 'is', 'a', 'manipulated', 'test', 'string', '']
삼항 if / then / else가 필요 없습니다. 제 생각에는 귀하의 질문 에이 답변이 필요합니다.
row = [unicode((x or '').strip()) for x in row]
"반복 가능한 항목으로 목록 만들기"
질문에 대한 구체적인 답을 제공하는 것보다 먼저 가능한 모든 형식을 일반화하는 것이 가장 좋습니다. 그렇지 않으면 독자는 답이 어떻게 결정되었는지 알 수 없습니다. 다음은 마지막 형식에서 마지막 else 절을 사용할 수 있는지 여부를 결정하는 데 골머리를 앓기 전에 생각했던 몇 가지 일반화 된 형식입니다.
[반복 가능한 항목에 대한 표현식 1 (항목)]
[반복 가능한 항목에 대한 조건부 1 인 경우 표현식 1 (항목)]
[expression1 (item) if conditional1 else expression2 (item) for item in iterable]
[expression1 (item) if conditional1 else expression2 (item) for item in iterable if conditional2]
'item'의 값은 조건절에서 사용할 필요가 없습니다. 'condition3'은 출력 목록에 값을 추가하거나 추가하지 않는 스위치로 사용할 수 있습니다.
예를 들어, 원래 문자열 목록에서 빈 문자열이나 공백 문자열을 제거하는 새 목록을 만들려면 :
newlist = [s.strip () 인 경우 firstlist의 s에 대해]
# coding=utf-8
def my_function_get_list():
my_list = [0, 1, 2, 3, 4, 5]
# You may use map() to convert each item in the list to a string,
# and then join them to print my_list
print("Affichage de my_list [{0}]".format(', '.join(map(str, my_list))))
return my_list
my_result_list = [
(
number_in_my_list + 4, # Condition is False : append number_in_my_list + 4 in my_result_list
number_in_my_list * 2 # Condition is True : append number_in_my_list * 2 in my_result_list
)
[number_in_my_list % 2 == 0] # [Condition] If the number in my list is even
for number_in_my_list in my_function_get_list() # For each number in my list
]
print("Affichage de my_result_list [{0}]".format(', '.join(map(str, my_result_list))))
(venv) $ python list_comp.py
Affichage de my_list [0, 1, 2, 3, 4, 5]
Affichage de my_result_list [0, 5, 4, 7, 8, 9]
그래서 당신을 위해 : row = [('', unicode(x.strip()))[x is not None] for x in row]
참고 URL : https://stackoverflow.com/questions/4260280/if-else-in-a-list-comprehension
'ProgramingTip' 카테고리의 다른 글
딥 카피와 얕은 카피의 차이점은 무엇입니까? (0) | 2020.09.29 |
---|---|
딜레마 : 프래그먼트와 활동을 사용하는 경우 : (0) | 2020.09.29 |
Visual Studio 솔루션에서 코드 줄을 어떻게 계산합니까? (0) | 2020.09.29 |
WebSockets vs. Server-Sent 이벤트 / EventSource (0) | 2020.09.29 |
Visual Studio에서 전체 디렉터리 구조를 "기존 항목 추가"어디에서 있습니까? (0) | 2020.09.29 |