Answers:
您完全可以做到这一点。这只是一个订购问题:
[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
after则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)
或者您可以使用lambda内联。
if
其else
语句块或s语句块中的表达式或代码可能出现的异常时,这也是一种很好的(也许只是)使用的技术。对于简单的情况,可接受的答案更好。
前面的答案已经解决了特定的问题,因此我将解决在列表推导中使用条件语句的一般想法。
这是一个示例,显示了如何在列表推导中编写条件语句:
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
,顺序为:
表达式 如果 条件 其他 表达式2 的 项目 在 迭代
我总是觉得很难记住expresseion1必须是之前,如果和表达式2必须是经过别人。我的头希望两者都在之前或之后。
我想它的设计一样,因为它类似于正常的语言,例如:“我想留在里面,如果下雨,否则我要到外面去”
用普通的英语,上面提到的两种列表理解可以表述为:
仅使用if
:
extract_apple 为 苹果 在 box_of_apples 如果 apple_is_ripe
与 if/else
mark_apple, 如果 apple_is_ripe 其他 ,则在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
从迭代列表中列出项目
最好首先概括所有可能的形式,而不是给出问题的具体答案。否则,读者将不知道答案是如何确定的。这是我在尝试确定是否可以在最后一种形式中使用final'子句之前想出的几种通用形式。
[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]