如果在python的列表理解if/else?

if/else in Python's list comprehension?

如何在Python中执行以下操作?

1
row = [unicode(x.strip()) for x in row if x is not None else '']

基本上:

  • 用空字符串替换所有的NONE,然后
  • 执行功能。

  • 你完全可以这样做,这只是一个订购问题:

    1
    [unicode(x.strip()) if x is not None else '' for x in row]

    一般来说,

    1
    [f(x) if condition else g(x) for x in sequence]

    并且,对于仅包含if条件的清单理解,

    1
    [f(x) for x in sequence if condition]

    注意,这实际上使用了一个不同的语言结构,一个条件表达式,它本身不是理解语法的一部分,而for…in后面的if是列表理解的一部分,用于从源iterable筛选元素。

    条件表达式可以用于各种情况,在这些情况下,您希望根据某些条件在两个表达式值之间进行选择。这与其他语言中存在的三元运算符?:相同。例如:

    1
    2
    value = 123
    print(value, 'is', 'even' if value % 2 == 0 else 'odd')


    一种方式:

    1
    2
    3
    4
    5
    6
    7
    def change(f):
        if f is None:
            return unicode(f.strip())
        else:
            return ''

    row = [change(x) for x in row]

    尽管如此,你有:

    1
    row = map(change, row)

    或者可以使用lambda内联。


    下面是另一个示例:

    1
    2
    >>> print(",".join(["ha" if i else"Ha" for i in range(3)]) +"!")
    Ha, ha, ha!

    它利用了这样一个事实:if i0False和对range()函数生成的所有其他值的True进行评估。因此,列表理解的评估如下:

    1
    2
    >>> ["ha" if i else"Ha" for i in range(3)]
    ['Ha', 'ha', 'ha']


    具体的问题已经在前面的答案中解决了,所以我将讨论在列表理解中使用条件的一般思想。

    下面是一个示例,说明如何在列表理解中编写条件:

    1
    2
    3
    4
    5
    6
    7
    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的第一个列表理解中,顺序是:

    expression for item in iterable if condition

    在对X_str_changed的最后一个列表理解中,顺序是:

    expression1 if condition else expression2 for item in iterable

    我总是觉得很难记住,表达1必须在"如果"之前,而表达2必须在"其他"之后。我的脑袋想两个都在之前或之后。

    我想它是这样设计的,因为它类似于正常语言,例如,"如果下雨我想呆在里面,否则我想出去。"


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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    row = [None, 'This', 'is', 'a', 'filler', 'test', 'string', None]

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

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

    print(res)

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


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # 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 is not None] for x in row]