Python에서 다음을 수행하려면 어떻게 해야 합니까?
row = [unicode(x.strip()) for x in row if x is not None else '']
기본적으로:
- 모든 None을 빈 문자열로 바꾼 다음
- 기능을 수행합니다.
질문자 :AP257
Python에서 다음을 수행하려면 어떻게 해야 합니까?
row = [unicode(x.strip()) for x in row if x is not None else '']
기본적으로:
당신은 완전히 할 수 있습니다. 그것은 단지 주문 문제입니다:
[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')
특정 문제는 이전 답변에서 이미 해결되었으므로 목록 내포 내에서 조건문을 사용하는 일반적인 아이디어를 다룰 것입니다.
다음은 목록 이해 내에서 조건문을 작성하는 방법을 보여주는 예입니다.
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
나는 항상 expression1 이 if 앞에 와야 하고 expression2 가 else 뒤에 있어야 한다는 것을 기억하기 어렵다는 것을 알게 되었습니다. 내 머리는 둘 다 전이나 후가 되기를 원합니다.
나는 그것이 설계 추측과 같은 정상적인 언어, 예를 들어 유사하기 때문에 "나는 비가 오면 내부에 있고 싶어를, 다른 나는 외부 가고 싶다"고
일반 영어에서는 위에서 언급한 두 가지 유형의 목록 이해를 다음과 같이 나타낼 수 있습니다.
다음과 같은 경우 if
:
apple_is_ripe인 경우 apple_box의 사과 에 대한 extract_apple
if/else
와 함께
mark_apple if apple_is_ripe 그렇지 않으면 apple_box 의 사과 에 대해 표시 되지 않은 상태로 둡니다.
일방 통행:
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
가 0
False
로 평가되고 range()
의해 생성된 다른 모든 값에 대해 True
로 평가된다는 사실을 이용합니다. 따라서 목록 이해는 다음과 같이 평가됩니다.
>>> ["ha" if i else "Ha" for i in range(3)] ['Ha', 'ha', 'ha']
다른 솔루션은 단일 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
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()]
당신은 이것을 할 수 있습니다
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]
이 질문을 사용하여 몇 가지 개념을 검토해 보겠습니다. 다양한 사례를 추론할 수 있도록 먼저 기본 사항을 확인하는 것이 좋다고 생각합니다.
다른 답변은 귀하의 질문에 대한 구체적인 답변을 제공합니다. 먼저 일반적인 상황을 설명한 다음 질문에 답하겠습니다.
if/else
문에는 두 가지가 포함됩니다.
목록을 만드는 간결한 방법을 제공합니다.
그 구조는 " 표현식을 포함하는 대괄호와 for 절, 0개 이상의 for 또는 if 절 "으로 구성됩니다.
여기에는 조건이 없습니다. 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]
여기에 한 가지 조건이 있습니다.
실시예 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]
하나 이상의 조건:
여기에서 조건식(삼항 연산자)의 도움이 필요합니다.
조건식이란? 이름이 말하는 것: 어떤 조건이 있는 Python 표현식.
<Exp1> if condition else <Exp2>
먼저 condition
이 평가됩니다. condition
이 True
이면 <Exp1>
이 평가되고 반환됩니다. condition
이 False
이면 <Exp2>
가 평가되어 반환됩니다.
둘 이상의 조건이 있는 조건식:
<Exp1> if condition else <Exp2> if condition else <Exp3>...
Real Python 의 예:
age = 12 s = 'minor' if age < 21 else 'adult' > minor
s
의 값은 age
값에 따라 달라집니다.
우리는 이와 같이 목록 이해와 조건문을 함께 넣습니다.
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]
추가 읽기:
삼항 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]
my_result_list의 부속서 [0, 5, 4, 7, 8, 9]
그래서, 당신을 위해 : row = [('', unicode(x.strip()))[x is not None] for x in row]
출처 : http:www.stackoverflow.com/questions/4260280/if-else-in-a-list-comprehension
출력을 파일 및 표준 출력으로 리디렉션하는 방법 (0) | 2023.04.28 |
---|---|
Vim에서 remap, noremap, nnoremap 및 vnoremap 매핑 명령의 차이점은 무엇입니까? (0) | 2023.04.28 |
jQuery 드롭다운에서 선택한 옵션 가져오기 (0) | 2023.04.28 |
개체 유형의 이름을 가져옵니다. (0) | 2023.04.28 |
Git에서 파일이 삭제된 시점 찾기 (0) | 2023.04.28 |