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

我尝试了:

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

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


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

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


当前回答

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

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

其他回答

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

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

这与如何理解列表有关。

请记住以下几点:

[ 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

你完全可以做到。这只是订购问题:

[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')

单向:

def change(x):
    if x is None:
        return f(x)
    else:
        return ''

result = [change(x) for x in xs]

尽管你有:

result = map(change, xs)

或者可以使用lambda内联。

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

因此,对于您:row=[(“”,unicode(x.strip()))[x不是None](对于行中的x)]