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

我尝试了:

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

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


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

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


当前回答

让我们用这个问题来回顾一些概念。我认为最好先看看基本面,这样你就可以推断出不同的情况。

其他答案为您的问题提供了具体答案。我将首先介绍一些一般情况,然后回答这个问题。

基本原理

列表理解中的if/else语句涉及两件事:

列表解析条件表达式(三元运算符)

1.列出理解

它们提供了创建列表的简洁方法。

它的结构包括:“括号包含一个表达式,后跟一个for子句,然后是零个或多个for或if子句”。

案例1

这里我们没有条件。iterable中的每个项都添加到new_list中。

new_list = [expression for item in iterable]
new_list = [x for x in range(1, 10)]
> [1, 2, 3, 4, 5, 6, 7, 8, 9]

案例2

这里我们有一个条件。

示例1

条件:只有偶数将被添加到new_list中。

new_list = [expression for item in iterable if condition == True]
new_list = [x for x in range(1, 10) if x % 2 == 0]
> [2, 4, 6, 8]

示例2

条件:只有3的倍数的偶数才会添加到new_list中。

new_list = [expression for item in iterable if condition == True]
new_list = [x for x in range(1, 10) if x % 2 == 0 if x % 3 == 0]
> [6]

但是,如果在new_list中使用两个if,为什么会有一个条件?

前面的表达式可以写成:

new_list = [x for x in range(1, 10) if x % 2 and x % 3 == 0]
> [6]

我们只使用一个if语句。

这就像在做:

new_list = []
for x in range(1, 10):
    if x % 2 == 0 and x % 3 == 0:
        new_list.append(x)
> [6]

示例3

为了便于讨论,您也可以使用或。

条件:偶数或3的倍数将添加到new_list中。

new_list = [x for x in range(1, 10) if x % 2 == 0 or x % 3 == 0]
> [2, 3, 4, 6, 8, 9]

案例3

多个条件:

这里我们需要条件表达式(三元运算符)的帮助。

2.条件表达式

什么是条件表达式?名称说明:具有某些条件的Python表达式。

<Exp1> if condition else <Exp2>

首先评估条件。如果条件为True,则计算并返回<Exp1>。如果条件为False,则求值并返回<Exp2>。

具有多个条件的条件表达式:

<Exp1> if condition else <Exp2> if condition else <Exp3>...    

Real Python的一个示例:

age = 12
s = 'minor' if age < 21 else 'adult'
> minor

s的值取决于年龄值。

3.列出带条件的理解

我们像这样把列表理解和条件放在一起。

new_list = [<Conditional Expression> for <item> in <iterable>]

new_list = [<Exp1> if condition else <Exp2> if condition else <Exp3> for <item> in <iterable>]

条件:偶数将被添加为“偶数”,第三个数字将添加为“第三个”,其余数字将添加“奇数”。

new_list = ['even' if x % 2 == 0 else 'number three' if x == 3 else 'odd' 
             for x in range(1, 10)]
> ['odd', 'even', 'number three', 'even', 'odd', 'even', 'odd', 'even', 'odd']

问题的答案

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

这里我们对列表的结构有一个问题:xs中的for x应该位于表达式的末尾。

正确方式:

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

进一步阅读:

Python是否有三元条件运算符?

其他回答

单向:

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

让我们用这个问题来回顾一些概念。我认为最好先看看基本面,这样你就可以推断出不同的情况。

其他答案为您的问题提供了具体答案。我将首先介绍一些一般情况,然后回答这个问题。

基本原理

列表理解中的if/else语句涉及两件事:

列表解析条件表达式(三元运算符)

1.列出理解

它们提供了创建列表的简洁方法。

它的结构包括:“括号包含一个表达式,后跟一个for子句,然后是零个或多个for或if子句”。

案例1

这里我们没有条件。iterable中的每个项都添加到new_list中。

new_list = [expression for item in iterable]
new_list = [x for x in range(1, 10)]
> [1, 2, 3, 4, 5, 6, 7, 8, 9]

案例2

这里我们有一个条件。

示例1

条件:只有偶数将被添加到new_list中。

new_list = [expression for item in iterable if condition == True]
new_list = [x for x in range(1, 10) if x % 2 == 0]
> [2, 4, 6, 8]

示例2

条件:只有3的倍数的偶数才会添加到new_list中。

new_list = [expression for item in iterable if condition == True]
new_list = [x for x in range(1, 10) if x % 2 == 0 if x % 3 == 0]
> [6]

但是,如果在new_list中使用两个if,为什么会有一个条件?

前面的表达式可以写成:

new_list = [x for x in range(1, 10) if x % 2 and x % 3 == 0]
> [6]

我们只使用一个if语句。

这就像在做:

new_list = []
for x in range(1, 10):
    if x % 2 == 0 and x % 3 == 0:
        new_list.append(x)
> [6]

示例3

为了便于讨论,您也可以使用或。

条件:偶数或3的倍数将添加到new_list中。

new_list = [x for x in range(1, 10) if x % 2 == 0 or x % 3 == 0]
> [2, 3, 4, 6, 8, 9]

案例3

多个条件:

这里我们需要条件表达式(三元运算符)的帮助。

2.条件表达式

什么是条件表达式?名称说明:具有某些条件的Python表达式。

<Exp1> if condition else <Exp2>

首先评估条件。如果条件为True,则计算并返回<Exp1>。如果条件为False,则求值并返回<Exp2>。

具有多个条件的条件表达式:

<Exp1> if condition else <Exp2> if condition else <Exp3>...    

Real Python的一个示例:

age = 12
s = 'minor' if age < 21 else 'adult'
> minor

s的值取决于年龄值。

3.列出带条件的理解

我们像这样把列表理解和条件放在一起。

new_list = [<Conditional Expression> for <item> in <iterable>]

new_list = [<Exp1> if condition else <Exp2> if condition else <Exp3> for <item> in <iterable>]

条件:偶数将被添加为“偶数”,第三个数字将添加为“第三个”,其余数字将添加“奇数”。

new_list = ['even' if x % 2 == 0 else 'number three' if x == 3 else 'odd' 
             for x in range(1, 10)]
> ['odd', 'even', 'number three', 'even', 'odd', 'even', 'odd', 'even', 'odd']

问题的答案

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

这里我们对列表的结构有一个问题:xs中的for x应该位于表达式的末尾。

正确方式:

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

进一步阅读:

Python是否有三元条件运算符?

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

你可以在理解中结合条件逻辑:

 ps = PorterStemmer()
 stop_words_english = stopwords.words('english')
 best = sorted(word_scores.items(), key=lambda x: x[1], reverse=True)[:10000]
 bestwords = set([w for w, s in best])


 def best_word_feats(words):
   return dict([(word, True) for word in words if word in bestwords])

 # with stemmer
 def best_word_feats_stem(words):
   return dict([(ps.stem(word), True) for word in words if word in bestwords])

 # with stemmer and not stopwords
 def best_word_feats_stem_stop(words):
   return dict([(ps.stem(word), True) for word in words if word in bestwords and word not in stop_words_english])