if/else in Python's list comprehension?
如何在Python中执行以下操作?
1 | row = [unicode(x.strip()) for x in row if x is not None else ''] |
基本上:
你完全可以这样做,这只是一个订购问题:
1 | [unicode(x.strip()) if x is not None else '' for x in row] |
一般来说,
1 | [f(x) if condition else g(x) for x in sequence] |
并且,对于仅包含
1 | [f(x) for x in sequence if condition] |
注意,这实际上使用了一个不同的语言结构,一个条件表达式,它本身不是理解语法的一部分,而
条件表达式可以用于各种情况,在这些情况下,您希望根据某些条件在两个表达式值之间进行选择。这与其他语言中存在的三元运算符
1 2 | value = 123 print(value, 'is', 'even' if value % 2 == 0 else 'odd') |
一种方式:
1 2 3 4 5 6 7 | def change(f): if f is None: return unicode(f.strip()) else: return '' row = [change(x) for x in row] |
尽管如此,你有:
1 | row = map(change, row) |
或者可以使用lambda内联。
下面是另一个示例:
1 2 | >>> print(",".join(["ha" if i else"Ha" for i in range(3)]) +"!") Ha, ha, ha! |
它利用了这样一个事实:
1 2 | >>> ["ha" if i else"Ha" for i in range(3)] ['Ha', 'ha', 'ha'] |
具体的问题已经在前面的答案中解决了,所以我将讨论在列表理解中使用条件的一般思想。
下面是一个示例,说明如何在列表理解中编写条件:
1 2 3 4 5 6 7 | 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 |
注意,在
expression for item in iterable if condition
在对
expression1 if condition else expression2 for item in iterable
我总是觉得很难记住,表达1必须在"如果"之前,而表达2必须在"其他"之后。我的脑袋想两个都在之前或之后。
我想它是这样设计的,因为它类似于正常语言,例如,"如果下雨我想呆在里面,否则我想出去。"
其他的解决方案对于单个
使用函数有助于提高可读性,但在映射是输入的工作流中,很难扩展或适应这种解决方案。字典可以缓解这些问题:
1 2 3 4 5 6 7 8 9 | 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', ''] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # 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附上我的清单[0,1,2,3,4,5]附上我的结果清单[0,5,4,7,8,9]
所以,对你来说: