我有一个包含字符串和None值的列表xs。如何使用列表理解来调用每个字符串上的函数,但将None值转换为“”(而不是将它们传递给函数)?
我尝试了:
[f(x) for x in xs if x is not None else '']
但它给出了SyntaxError。正确的语法是什么?
如果您试图创建一个省略基于条件的值的列表理解,请参阅带条件的列表理解。
如果需要考虑两个以上的条件结果,请注意Python的条件表达式不支持elif。相反,需要嵌套if/else条件。有关详细信息,请参见列表理解条件中的“elif”。
你完全可以做到。这只是订购问题:
[f(x) if x is not None else '' for x in xs]
一般来说
[f(x) if condition else g(x) for x in sequence]
并且,对于仅具有if条件的列表理解,
[f(x) for x in sequence if condition]
请注意,这实际上使用了一个不同的语言构造,一个条件表达式,它本身不是理解语法的一部分,而for…in后面的if是列表理解的一部分并用于从源可迭代元素中过滤元素。
条件表达式可以用于各种情况,在这些情况下,您需要根据某些条件在两个表达式值之间进行选择。这与三元运算符相同?:它存在于其他语言中。例如:
value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')
从可迭代的
最好先概括所有可能的形式,而不是给出问题的具体答案。否则,读者将不知道答案是如何确定的。下面是我在决定最后一个形式中是否可以使用final 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()]
你完全可以做到。这只是订购问题:
[f(x) if x is not None else '' for x in xs]
一般来说
[f(x) if condition else g(x) for x in sequence]
并且,对于仅具有if条件的列表理解,
[f(x) for x in sequence if condition]
请注意,这实际上使用了一个不同的语言构造,一个条件表达式,它本身不是理解语法的一部分,而for…in后面的if是列表理解的一部分并用于从源可迭代元素中过滤元素。
条件表达式可以用于各种情况,在这些情况下,您需要根据某些条件在两个表达式值之间进行选择。这与三元运算符相同?:它存在于其他语言中。例如:
value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')
下面是另一个示例:
>>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!")
Ha, ha, ha!
它利用了这样一个事实,即如果我对0求值为False,对函数range()生成的所有其他值求值为True。因此,列表理解评估如下:
>>> ["ha" if i else "Ha" for i in range(3)]
['Ha', 'ha', 'ha']