파이썬에서 다음을 어떻게 할 수 있습니까?
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
에서 순서는 다음과 같습니다.
표현 에 대한 항목 에서 반복 가능한 경우 조건
에 대한 마지막 목록 이해 X_str_changed
에서 순서는 다음과 같습니다.
expression1이 경우 조건에 다른 사람 이 expression2 에 대한 항목 에서 반복 가능한
나는 항상 expresseion1 이 if 이전에 있어야 하고 expression2 가 다른 이후에 있어야 한다는 것을 기억하기가 어렵다는 것을 안다 . 내 머리는 둘 다 이전 또는 이후가되기를 원합니다.
나는 그것이 설계 추측과 같은 정상적인 언어, 예를 들어 유사하기 때문에 “나는 내 체류하려는 경우 비가를, 다른 나는 외부 가고 싶어”
일반 영어로 위에서 언급 한 두 가지 유형의 목록 이해는 다음과 같이 표현 될 수 있습니다.
와 함께 if
:
사과 를 위한 extract_apple apple_is_ripe 인 경우 box_of_apples의
와 if/else
mark_apple 경우 apple_is_ripe는 다른 leave_it_unmarked 에 대한 사과 에 box_of_apples
답변
다른 솔루션은 단일 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', '']
답변
목록 이해가 수행되는 방식과 관련이 있습니다.
다음을 명심하십시오.
[ expression for item in list if conditional ]
다음과 같습니다.
for item in list:
if conditional:
expression
의 expression
형식이 약간 다른 경우 (문장과 동사 순서를 문장으로 전환하는 것을 고려하십시오).
따라서 코드 [x+1 for x in l if x >= 45]
는 다음을 수행합니다.
for x in l:
if x >= 45:
x+1
그러나이 코드 [x+1 if x >= 45 else x+5 for x in l]
는 (을 재정렬 한 후 expression
)이 작업을 수행합니다.
for x in l:
if x>=45: x+1
else: x+5
답변
if / then / else에는 3 진이 필요하지 않습니다. 내 의견으로는 귀하의 질문 에이 답변이 필요합니다.
row = [unicode((x or '').strip()) for x in row]