ProgramingTip

목록 이해력에 권한이 있습니까?

bestdevel 2020. 9. 29. 08:11
반응형

목록 이해력에 권한이 있습니까?


어디에 있습니까?

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평가 되는 사실을 이용합니다 . 이해력은 다음과 같이 평가됩니다.False0Truerange()

>>> ["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에서 순서는 다음과 같습니다.

반복 가능한 if 조건의 항목 대한 표현식

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

expression1이 경우 조건에 다른 사람 이 expression2 에 대한 항목 에서 반복 가능한

나는 항상 expresseion1if 앞에 있어야 하고 expression2else 뒤에 있어야 한다는 것을 기억하기 어렵습니다 . 내 머리는 둘 다 전후에 있기를 원합니다.

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


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

삼항 if / then / else가 필요 없습니다. 제 생각에는 귀하의 질문 에이 답변이 필요합니다.

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

"반복 가능한 항목으로 목록 만들기"

질문에 대한 구체적인 답을 제공하는 것보다 먼저 가능한 모든 형식을 일반화하는 것이 가장 좋습니다. 그렇지 않으면 독자는 답이 어떻게 결정되었는지 알 수 없습니다. 다음은 마지막 형식에서 마지막 else 절을 ​​사용할 수 있는지 여부를 결정하는 데 골머리를 앓기 전에 생각했던 몇 가지 일반화 된 형식입니다.

[반복 가능한 항목에 대한 표현식 1 (항목)]

[반복 가능한 항목에 대한 조건부 1 인 경우 표현식 1 (항목)]

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

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

newlist = [s.strip () 인 경우 firstlist의 s에 대해]


# 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
Affichage de my_list [0, 1, 2, 3, 4, 5]
Affichage de 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

반응형