我有一个包含字符串和None值的列表xs。如何使用列表理解来调用每个字符串上的函数,但将None值转换为“”(而不是将它们传递给函数)?

我尝试了:

[f(x) for x in xs if x is not None else '']

但它给出了SyntaxError。正确的语法是什么?


如果您试图创建一个省略基于条件的值的列表理解,请参阅带条件的列表理解。

如果需要考虑两个以上的条件结果,请注意Python的条件表达式不支持elif。相反,需要嵌套if/else条件。有关详细信息,请参见列表理解条件中的“elif”。


当前回答

下面是另一个示例:

>>> 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']

其他回答

其他解决方案对于单个if/else构造非常有用。然而,列表理解中的三元语句很难理解。

使用函数有助于可读性,但在映射是输入的工作流中,这样的解决方案很难扩展或适应。词典可以缓解这些担忧:

xs = [None, 'This', 'is', 'a', 'filler', 'test', 'string', None]

d = {None: '', 'filler': 'manipulated'}

res = [d.get(x, x) for x in xs]

print(res)

['', 'This', 'is', 'a', 'manipulated', 'test', 'string', '']

下面是另一个示例:

>>> 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']
[f(x) if x != None else '' for x in xs]

列表理解语法:

[item if condition else item for item in items]
[f(item) if condition else value for item in items]
[item if condition for item in items]
[value if condition else value1 if condition1 else value2]

这与如何理解列表有关。

请记住以下几点:

[ expression for item in list if conditional ]

相当于:

for item in list:
    if conditional:
        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]执行此操作(重新排列表达式后):

for x in l:
    if x>=45: x+1
    else: x+5

不需要三元if/then/else。我认为你的问题需要这样的答案:

row = [unicode((x or '').strip()) for x in row]