목록 이해에 있다면 = [unicode(x.strip()) for

파이썬에서 다음을 어떻게 할 수 있습니까?

row = [unicode(x.strip()) for x in row if x is not None else '']

본질적으로 :

  1. 모든 없음을 빈 문자열로 바꾼 다음
  2. 기능을 수행하십시오.


답변

당신은 완전히 할 수 있습니다. 주문 문제 일뿐입니다.

[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평가 False0및에 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 에 대한 항목 에서 반복 가능한

나는 항상 expresseion1if 이전에 있어야 하고 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]