etc./StackOverFlow

목록 이해에서 if/else

청렴결백한 만능 재주꾼 2023. 4. 28. 04:05
반응형

질문자 :AP257


Python에서 다음을 수행하려면 어떻게 해야 합니까?

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

기본적으로:

  1. 모든 None을 빈 문자열로 바꾼 다음
  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]

이것은 실제로 다른 언어 구성인 조건식 을 사용하는데, 그 자체는 이해 구문의 일부가 아닙니다. 반면 for…in 뒤의 if 는 목록 이해의 일부이며 소스 iterable에서 요소 를 필터링하는 데 사용됩니다.


조건식은 특정 조건에 따라 두 개의 표현식 값 중에서 선택하려는 모든 상황에서 사용할 수 있습니다. 이것은 다른 언어에 존재하는 삼항 연산자 ?: 와 동일합니다. 예를 들어:

 value = 123 print(value, 'is', 'even' if value % 2 == 0 else 'odd')

poke

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

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

 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 에 대한 첫 번째 목록 이해에서 순서는 다음과 같습니다.

iterable if 조건의 항목 대한 표현식

X_str_changed 에 대한 마지막 목록 이해에서 순서는 다음과 같습니다.

반복 가능한 항목 대한 표현식1 if 조건 else 표현식2

나는 항상 expression1if 앞에 와야 하고 expression2else 뒤에 있어야 한다는 것을 기억하기 어렵다는 것을 알게 되었습니다. 내 머리는 둘 다 전이나 후가 되기를 원합니다.

나는 그것이 설계 추측과 같은 정상적인 언어, 예를 들어 유사하기 때문에 "나는 비가 오면 내부에 있고 싶어를, 다른 나는 외부 가고 싶다"고

일반 영어에서는 위에서 언급한 두 가지 유형의 목록 이해를 다음과 같이 나타낼 수 있습니다.

다음과 같은 경우 if :

apple_is_ripe인 경우 apple_box의 사과 대한 extract_apple

if/else 와 함께

mark_apple if apple_is_ripe 그렇지 않으면 apple_box 의 사과 대해 표시 되지 않은 상태로 둡니다.


Tim Skov Jacobsen

일방 통행:

 def change(f): if f is None: return unicode(f.strip()) else: return '' row = [change(x) for x in row]

그때 당신이 가지고 있지만 :

 row = map(change, row)

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


Adam Vandenberg

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

 >>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!") Ha, ha, ha!

if i0 False 로 평가되고 range() 의해 생성된 다른 모든 값에 대해 True 로 평가된다는 사실을 이용합니다. 따라서 목록 이해는 다음과 같이 평가됩니다.

 >>> ["ha" if i else "Ha" for i in range(3)] ['Ha', 'ha', 'ha']

Bengt

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

jpp

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

다음 사항에 유의하십시오.

 [ 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

arboc7

iterable의 항목에서 목록 만들기

질문에 대한 구체적인 답변을 제공하는 것보다 먼저 가능한 모든 형식을 일반화하는 것이 가장 좋은 것 같습니다. 그렇지 않으면 독자는 답이 어떻게 결정되었는지 알지 못할 것입니다. 다음은 마지막 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 값은 조건절에서 사용할 필요가 없습니다. conditional3 은 출력 목록에 값을 추가하거나 추가하지 않는 스위치로 사용할 수 있습니다.

예를 들어, 원래 문자열 목록에서 빈 문자열이나 공백 문자열을 제거하는 새 목록을 만들려면:

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

Hewey Dewey

당신은 이것을 할 수 있습니다

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

목록 이해를 위한 일부 구문:

 [item if condition else item for item in items] [f(item) if condition else value for item in items] [item if condition for item in items] [value if condition else value1 if condition1 else value2]

MD. ABU SAYED

이 질문을 사용하여 몇 가지 개념을 검토해 보겠습니다. 다양한 사례를 추론할 수 있도록 먼저 기본 사항을 확인하는 것이 좋다고 생각합니다.

다른 답변은 귀하의 질문에 대한 구체적인 답변을 제공합니다. 먼저 일반적인 상황을 설명한 다음 질문에 답하겠습니다.

기초

if/else 문에는 두 가지가 포함됩니다.

  • 목록 이해
  • 조건식(삼항 연산자)

1. 목록 이해

목록을 만드는 간결한 방법을 제공합니다.

그 구조는 " 표현식을 포함하는 대괄호와 for 절, 0개 이상의 for 또는 if 절 "으로 구성됩니다.

사례 1

여기에는 조건이 없습니다. iterable의 각 항목은 new_list 추가됩니다.

 new_list = [expression for item in iterable] new_list = [x for x in range(1, 10)] > [1, 2, 3, 4, 5, 6, 7, 8, 9]

사례 2

여기에 한 가지 조건이 있습니다.

실시예 1

조건: 짝수 new_list 추가됩니다.

 new_list = [expression for item in iterable if condition == True] new_list = [x for x in range(1, 10) if x % 2 == 0] > [2, 4, 6, 8]

실시예 2

조건: 3의 배수인 짝수 new_list 추가됩니다.

 new_list = [expression for item in iterable if condition == True] new_list = [x for x in range(1, 10) if x % 2 == 0 if x % 3 == 0] > [6]

new_list if 두 개를 사용하면 어떻게 하나의 조건이 있습니까?

이전 표현식은 다음과 같이 쓸 수 있습니다.

 new_list = [x for x in range(1, 10) if x % 2 and x % 3 == 0] > [6]

if 문은 하나만 사용합니다.

이것은 다음과 같습니다.

 new_list = [] for x in range(1, 10): if x % 2 == 0 and x % 3 == 0: new_list.append(x) > [6]

실시예 3

or 를 사용할 수도 있습니다.

조건: 짝수 또는 3의 배수가 new_list 추가됩니다.

 new_list = [x for x in range(1, 10) if x % 2 == 0 or x % 3 == 0] > [2, 3, 4, 6, 8, 9]

사례 2

하나 이상의 조건:

여기에서 조건식(삼항 연산자)의 도움이 필요합니다.

2.조건식

조건식이란? 이름이 말하는 것: 어떤 조건이 있는 Python 표현식.

 <Exp1> if condition else <Exp2>

먼저 condition 이 평가됩니다. conditionTrue 이면 <Exp1> 이 평가되고 반환됩니다. conditionFalse 이면 <Exp2> 가 평가되어 반환됩니다.

둘 이상의 조건이 있는 조건식:

 <Exp1> if condition else <Exp2> if condition else <Exp3>...

Real Python 의 예:

 age = 12 s = 'minor' if age < 21 else 'adult' > minor

s 의 값은 age 값에 따라 달라집니다.

3. 조건문을 사용한 List Comprehension

우리는 이와 같이 목록 이해와 조건문을 함께 넣습니다.

 new_list = [<Conditional Expression> for <item> in <iterable>] new_list = [<Exp1> if condition else <Exp2> if condition else <Exp3> for <item> in <iterable>]

조건: 짝수'even' , 3은 'number three' , 나머지는 'odd' 로 추가합니다.

 new_list = ['even' if x % 2 == 0 else 'number three' if x == 3 else 'odd' for x in range(1, 10)] > ['odd', 'even', 'number three', 'even', 'odd', 'even', 'odd', 'even', 'odd']

질문에 대한 답변

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

여기에 목록의 구조에 문제 for x in row 는 표현식의 끝에 있어야 합니다.

올바른 방법:

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

추가 읽기:

Python에 삼항 조건 연산자가 있습니까?


Guzman Ojero

삼항 if/then/else가 필요하지 않습니다. 제 생각에는 귀하의 질문에 다음과 같은 답변이 필요합니다.

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

mariotomo

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

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

Max Kleiner

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


Trop Freshloïc

출처 : http:www.stackoverflow.com/questions/4260280/if-else-in-a-list-comprehension

반응형