带有else pass的列表推导式

25

如何在列表推导式中实现以下功能?

test = [["abc", 1],["bca",2]]

result = []
for x in test:
    if x[0] =='abc':
        result.append(x)
    else:
        pass
result
Out[125]: [['abc', 1]]

尝试 1:

[x if (x[0] == 'abc') else pass for x in test]
  File "<ipython-input-127-d0bbe1907880>", line 1
    [x if (x[0] == 'abc') else pass for x in test]
                                  ^
SyntaxError: invalid syntax

尝试2:

[x if (x[0] == 'abc') else None for x in test]
Out[126]: [['abc', 1], None]

尝试3:

[x if (x[0] == 'abc') for x in test]
  File "<ipython-input-122-a114a293661f>", line 1
    [x if (x[0] == 'abc') for x in test]
                            ^
SyntaxError: invalid syntax

1
嗨,WoodChopper。实际上,在for循环中,如果满足条件,就会执行某些操作,如果不满足条件,则什么也不会发生...所以else: pass是多余的。 - Jblasco
@Jblasco:谢谢,我的第一次尝试是Try 3,但不像jaco提到的那样按正确顺序。 - WoodChopper
3个回答

54

if需要放在最后,而且在列表推导式中不需要pass。只有当if条件得到满足时,元素才会被添加到结果列表中,否则该元素将被忽略,因此pass在列表推导式语法中被隐含实现。

[x for x in test if x[0] == 'abc']

为了完整起见,该语句的输出为:

[['abc', 1]]

9
作为 Jaco 回答的补充; 知道 filter 命令是不错的,因为你基本上想要的是 过滤 列表:
filter( lambda x: x[0]=='abc', test)

这将返回:

  • 在Python 2中是一个列表
  • 在Python 3中是一个生成器(对于非常长的列表可能很有用,因为您可以稍后处理结果而不会过度占用内存);如果您仍然想要一个列表,只需使用list()构造函数包装上面的filter函数即可。

1

在 for 循环后面加上 if 语句,对于我的使用情况有效。

data = [a for a in source_list if (your_condition)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接