답변:
당신은 완전히 할 수 있습니다. 주문 문제 일뿐입니다.
[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')
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]
있습니다. 귀찮게해서 죄송합니다. 답변 주셔서 감사합니다.
일방 통행:
def change(f):
if f is None:
return unicode(f.strip())
else:
return ''
row = [change(x) for x in row]
그럼에도 불구하고 당신은 가지고 있습니다 :
row = map(change, row)
또는 람다 인라인을 사용할 수 있습니다.
if
표현식이나 코드에서 가능한 예외를 처리해야 할 때 사용하는 좋은 기술 일 수도 else
있습니다. 간단한 경우에는 허용되는 답변이 더 좋습니다.
특정 문제는 이전 답변에서 이미 해결되었으므로 목록 이해 내에서 조건을 사용하는 일반적인 아이디어를 다룰 것입니다.
다음은 목록 이해 내에 조건문을 작성하는 방법을 보여주는 예입니다.
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 에 대한 항목 에서 반복 가능한
나는 항상 expresseion1 이 if 이전에 있어야 하고 expression2 가 다른 이후에 있어야 한다는 것을 기억하기가 어렵다는 것을 안다 . 내 머리는 둘 다 이전 또는 이후가되기를 원합니다.
나는 그것이 설계 추측과 같은 정상적인 언어, 예를 들어 유사하기 때문에 "나는 내 체류하려는 경우 비가를, 다른 나는 외부 가고 싶어"
일반 영어로 위에서 언급 한 두 가지 유형의 목록 이해는 다음과 같이 표현 될 수 있습니다.
와 함께 if
:
사과 를 위한 extract_apple apple_is_ripe 인 경우 box_of_apples의
와 if/else
mark_apple 경우 apple_is_ripe는 다른 leave_it_unmarked 에 대한 사과 에 box_of_apples
다른 솔루션은 단일 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
반복 가능한 항목에서 목록 만들기
질문에 대한 구체적인 답변을 제시하기보다는 가능한 모든 양식을 일반화하는 것이 가장 좋습니다. 그렇지 않으면 독자는 답이 어떻게 결정되었는지 알 수 없습니다. 다음은 마지막 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()]
조건부 논리를 이해에 결합 할 수 있습니다.
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]