首页 文章

if / else在Python的列表理解中?

提问于
浏览
585

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

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

实质上:

  • 用空字符串替换所有Nones,然后

  • 执行一个功能 .

5 回答

  • 892

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

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

    请注意,这实际上使用了不同的语言构造conditional expression,它本身不是comprehension syntax的一部分,而 if 之后的 if 是列表推导的一部分,用于过滤源迭代中的元素 .

    条件表达式可用于您希望根据某些条件在两个表达式值之间进行选择的各种情况 . 这与ternary operator ?: that exists in other languages相同 . 例如:

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

    单程:

    def change(f):
        if f is None:
            return unicode(f.strip())
        else:
            return ''
    
    row = [change(x) for x in row]
    

    虽然你有:

    row = map(change, row)
    

    或者你可以使用lambda内联 .

  • 38

    这是另一个说明性的例子:

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

    它利用了 if i0 评估 FalseTrue 为函数 range() 生成的所有其他值评估的事实 . 因此,列表理解评估如下:

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

    在以前的答案中已经解决了具体问题,因此我将讨论在列表推导中使用条件的一般概念 .

    这是一个示例,显示如何在列表推导中编写条件:

    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 的第一个列表推导中,顺序为:

    expression1的值,如果是expression2

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

    value1 if expression1 else value2 for expression2

    我总是发现很难记住value1必须在 if 之前,而value2必须在 else 之后 . 我的头想要在之前或之后 .

    我想它的设计是这样的,因为它类似于普通语言,例如“我想呆在里面 if 下雨, else 我想要出去”

  • 2

    其他解决方案非常适合单个 if / else 构造 . 但是,列表推导中的三元语句可能难以理解 .

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

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

相关问题