value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')
11
单程:
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内联 .
38
这是另一个说明性的例子:
>>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!")
Ha, ha, ha!
它利用了 if i 为 0 评估 False 和 True 为函数 range() 生成的所有其他值评估的事实 . 因此,列表理解评估如下:
>>> ["ha" if i else "Ha" for i in range(3)]
['Ha', 'ha', 'ha']
31
在以前的答案中已经解决了具体问题,因此我将讨论在列表推导中使用条件的一般概念 .
这是一个示例,显示如何在列表推导中编写条件:
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 的第一个列表推导中,顺序为:
expression1的值,如果是expression2
在 X_str_changed 的最后一个列表理解中,顺序是:
value1 if expression1 else value2 for expression2
我总是发现很难记住value1必须在 if 之前,而value2必须在 else 之后 . 我的头想要在之前或之后 .
我想它的设计是这样的,因为它类似于普通语言,例如“我想呆在里面 if 下雨, else 我想要出去”
5 回答
你完全可以做到这一点,这只是一个订购问题:
请注意,这实际上使用了不同的语言构造conditional expression,它本身不是comprehension syntax的一部分,而
if
之后的if
是列表推导的一部分,用于过滤源迭代中的元素 .条件表达式可用于您希望根据某些条件在两个表达式值之间进行选择的各种情况 . 这与ternary operator ?: that exists in other languages相同 . 例如:
单程:
虽然你有:
或者你可以使用lambda内联 .
这是另一个说明性的例子:
它利用了
if i
为0
评估False
和True
为函数range()
生成的所有其他值评估的事实 . 因此,列表理解评估如下:在以前的答案中已经解决了具体问题,因此我将讨论在列表推导中使用条件的一般概念 .
这是一个示例,显示如何在列表推导中编写条件:
请注意,在
X_non_str
的第一个列表推导中,顺序为:在
X_str_changed
的最后一个列表理解中,顺序是:我总是发现很难记住value1必须在 if 之前,而value2必须在 else 之后 . 我的头想要在之前或之后 .
我想它的设计是这样的,因为它类似于普通语言,例如“我想呆在里面 if 下雨, else 我想要出去”
其他解决方案非常适合单个
if
/else
构造 . 但是,列表推导中的三元语句可能难以理解 .使用函数有助于可读性,但是这种解决方案难以在映射是输入的工作流中扩展或适应 . 字典可以缓解这些问题: