source

목록 이해에 있어서 if/inclused

lovecheck 2023. 2. 1. 21:54
반응형

목록 이해에 있어서 if/inclused

어떻게 모든 할 수 요?None문자열이 s를 호출하고 합니다.f

[f(x) for x in xs if x is not None else '']

당신은 할 수 있어요.단지 주문에 관한 문제일 뿐입니다.

[f(x) if x is not None else '' for x in xs]

일반적으로는

[f(x) if condition else g(x) for x in sequence]

목록 에서는 ,, 스, 스, 리, 리, comp, comp, comp, comp, and, and, and.if 조건만,

[f(x) for x in sequence if condition]

이것은 실제로 다른 언어 구조인 조건식을 사용하는 것에 주의해 주세요.조건식 자체는 이해 구문의 일부가 아니지만iffor…in는 목록 통합의 일부로 소스 반복 가능에서 요소를 필터링하기 위해 사용됩니다.


조건식은 어떤 조건에 따라 두 식 값 중 하나를 선택하는 모든 상황에서 사용할 수 있습니다.이는 다른 언어에 존재하는 3진 연산자와 동일합니다.예를 들어 다음과 같습니다.

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

구체적인 문제는 앞의 답변에서 이미 해결되었으므로 리스트의 포괄 안에서 조건을 사용하는 일반적인 생각에 대해 설명하겠습니다.

다음으로 조건의 기입을 리스트의 이해 내에 실시하는 예를 나타냅니다.

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을 사용하다

식1 한다면 조건. 또 다른 식 2 위해서 아이템 반복할 수 있다

expression1이 if보다 앞에 있어야 하고 expression2가 다른 뒤에 있어야 한다는 것을 항상 기억하는 것은 어렵습니다.내 머리는 둘 다 전이나 후나 되고 싶어.

'비가 오면 에 있고, 아니면 밖에 나가고 싶다'는 등 일반 언어와 비슷하기 때문에 그렇게 설계되어 있는 것 같습니다.

쉬운 영어에서는 위에서 언급한 두 가지 유형의 목록 이해가 다음과 같이 표현될 수 있다.

★★★만 if:

추출_애플 위해서 사과 apple_box 한다면 apple_is_clossible

★★★★★★★★★★★★★★★★와 함께if/else

마크_애플 한다면 apple_is_clossible 또 다른 마크가 붙어 있지 않다 위해서 사과 apple_box

이 질문을 사용하여 몇 가지 개념을 복습해 보겠습니다.다른 경우를 추론할 수 있도록 기본을 먼저 보는 것이 좋다고 생각합니다.

다른 답변은 질문에 대한 구체적인 답변을 제공합니다.제가 먼저 일반적인 문맥을 설명하고 그 다음에 질문에 답하겠습니다.

기초

if/else목록 포괄에 있는 문장은 다음 두 가지를 포함합니다.

  • 일람표
  • 조건식(삼진 연산자)

1. 이해의 일람

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

이 구조는 "표현식 뒤에 for 절이 이어지는 괄호, 그리고 0 이상의 for 또는 if 절"로 구성됩니다.

케이스 1

여기엔 아무 조건도 없다.반복 가능한 각 항목이 에 추가됩니다.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]

왜 의 조건이 거죠?ifnew_list

앞의 표현은 다음과 같이 쓸 수 있습니다.

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

만만 1는 1개만 합니다.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]

케이스 3

여러 조건:

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

2. 조건식

조건식이 뭐죠?이름이 말하는 것: 어떤 조건을 가진 Python 표현입니다.

<Exp1> if condition else <Exp2>

번째는 ★★★★condition만약 conditionTrue , , , 「 」<Exp1>평가되어 반환됩니다. ifconditionFalse , , , 「 」<Exp2>평가되어 반환됩니다.

여러 조건을 가진 조건식:

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

Real Python의 예:

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

「」의 값s is 로 있다agediscloss.discloss 。

3. 조건을 포함한 리스트 정리

리스트의 종합과 조건을 이렇게 정리했습니다.

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번, 3번은 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']

질문에 대한 답변

[f(x) for x in xs if x is not None else '']

목록.for x in xs표현식의 끝에 있어야 합니다.

올바른 방법:

[f(x) if x is not None else '' for x in xs]

추가 정보:

Python에는 3진수 조건 연산자가 있나요?

편도:

def change(x):
    if x is None:
        return f(x)
    else:
        return ''

result = [change(x) for x in xs]

다음과 같은 이점이 있습니다.

result = map(change, xs)

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

다음으로 다른 예를 제시하겠습니다.

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

라는 사실을 이용하다if iFalse★★★★★★에0 ★★★★★★★★★★★★★ ★★★★True에 되는 기타 range()따라서 목록 이해도는 다음과 같이 평가됩니다.

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

.ifelse은 거의.그러나 목록 이해 내의 삼원 문장은 거의 읽기 어렵다.

함수를 사용하면 가독성이 향상되지만 매핑이 입력인 워크플로우에서는 이러한 솔루션을 확장하거나 조정하기가 어렵습니다.사전은 다음과 같은 문제를 완화할 수 있습니다.

xs = [None, 'This', 'is', 'a', 'filler', 'test', 'string', None]

d = {None: '', 'filler': 'manipulated'}

res = [d.get(x, x) for x in xs]

print(res)

['', 'This', 'is', 'a', 'manipulated', 'test', 'string', '']
[f(x) if x != None else '' for x in xs]

목록 이해 구문:

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

그것은 목록 이해의 수행 방식과 관련이 있다.

다음의 점에 주의해 주세요.

[ 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

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

질문에 대한 구체적인 답변을 하기보다는 가능한 모든 양식을 먼저 일반화하는 것이 최선인 것 같습니다.그렇지 않으면 독자는 답이 어떻게 결정되었는지 알 수 없습니다.여기 내가 머리가 아프기 전에 생각해 낸 몇 가지 일반화된 서식이 있다. 마지막 서식에 다른 마지막 서식을 사용할 수 있는지 결정하려고 한다.

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

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

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

3진법의 if/thenary if / then / else제 생각에 당신의 질문은 다음과 같습니다.

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

조건부 로직은 다음과 같이 조합할 수 있습니다.

 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])
# 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]
4, 8, 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

반응형