목록 이해에 있다면


답변:


1457

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

[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')

141
여기의 if / else는 이제 "삼항 연산자"구문이며 이해 구문을 나열하지 않습니다.
Adam Vandenberg

8
그래서 삼항 연산자를 대괄호로 묶는 것을 선호하는 이유는 이해가 아니라 정상적인 표현이라는 것을 분명히합니다.
Jochen Ritzel

17
그래서 속임수는 "목록 압축에서 이전에 쓰면 다른 부분도 추가해야한다"입니다. 내 경우 나에게 오류 l = [ 2, 3, 4, 5][x if x % 2 == 0 for x in l]주는 반면 [x if x % 2 == 0 else 200 for x in l]작동합니다. 예, 필터링해야한다는 것을 알고 [ x for x in l if x % 2 == 0]있습니다. 귀찮게해서 죄송합니다. 답변 주셔서 감사합니다.
Grijesh Chauhan

5
파이썬 문서는 삼항 연산자를 언급 . 다른 것이 필요하거나 작동하지 않습니다.
naught101

4
@Drewdin List 이해는 반복 중에 중단을 지원하지 않습니다. 그런 다음 일반 루프를 사용해야합니다.
찌를

44

일방 통행:

def change(f):
    if f is None:
        return unicode(f.strip())
    else:
        return ''

row = [change(x) for x in row]

그럼에도 불구하고 당신은 가지고 있습니다 :

row = map(change, row)

또는 람다 인라인을 사용할 수 있습니다.


13
이것은 또한 s 문 블록 의 if표현식이나 코드에서 가능한 예외를 처리해야 할 때 사용하는 좋은 기술 일 수도 else있습니다. 간단한 경우에는 허용되는 답변이 더 좋습니다.
martineau

37

다음은 또 다른 예시입니다.

>>> 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']

37

특정 문제는 이전 답변에서 이미 해결되었으므로 목록 이해 내에서 조건을 사용하는 일반적인 아이디어를 다룰 것입니다.

다음은 목록 이해 내에 조건문을 작성하는 방법을 보여주는 예입니다.

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


7

다른 솔루션은 단일 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', '']

1

목록 이해가 수행되는 방식과 관련이 있습니다.

다음을 명심하십시오.

[ 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

0

if / then / else에는 3 진이 필요하지 않습니다. 내 의견으로는 귀하의 질문 에이 답변이 필요합니다.

row = [unicode((x or '').strip()) for x in row]

0

반복 가능한 항목에서 목록 만들기

질문에 대한 구체적인 답변을 제시하기보다는 가능한 모든 양식을 일반화하는 것이 가장 좋습니다. 그렇지 않으면 독자는 답이 어떻게 결정되었는지 알 수 없습니다. 다음은 마지막 else '절을 마지막 양식에 사용할 수 있는지 결정하려고 두통을 겪기 전에 생각한 몇 가지 일반 양식입니다.

[expression1(item)                                        for item in iterable]

[expression1(item) if conditional1                        for item in iterable]

[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조건절에 값을 사용할 필요는 없습니다. A conditional3는 출력 목록에 값을 추가하거나 추가하지 않는 스위치로 사용할 수 있습니다.

예를 들어, 원래 문자열 목록에서 빈 문자열 또는 공백 문자열을 제거하는 새 목록을 작성하려면 다음을 수행하십시오.

newlist = [s for s in firstlist if s.strip()]

1
두 번째는 Tim 이 자신의 의견에 답변 한대로 오류를 제공합니다 . 파이썬 문서 의 조건문 도 참조하십시오 . 나에게 읽을 수없는 것. 요약 : this if condition else that또는 정규식 만 허용됩니다. 하지 value = this if condition(달성 할 수있는 value = this if condition else None)
Anderium

0

조건부 논리를 이해에 결합 할 수 있습니다.

 ps = PorterStemmer()
 stop_words_english = stopwords.words('english')
 best = sorted(word_scores.items(), key=lambda x: x[1], reverse=True)[:10000]
 bestwords = set([w for w, s in best])


 def best_word_feats(words):
   return dict([(word, True) for word in words if word in bestwords])

 # with stemmer
 def best_word_feats_stem(words):
   return dict([(ps.stem(word), True) for word in words if word in bestwords])

 # with stemmer and not stopwords
 def best_word_feats_stem_stop(words):
   return dict([(ps.stem(word), True) for word in words if word in bestwords and word not in stop_words_english])

-2
# 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
my_list 가맹점 [0, 1, 2, 3, 4, 5]
my_result_list 가맹점 [0, 5, 4, 7, 8, 9]

그래서 당신을 위해 : row = [('', unicode(x.strip()))[x is not None] for x in row]


무엇 않습니다 "Affichage 드 ..." 의미? 프랑스어인가요?
Peter Mortensen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.