2015-11-13 64 views
4

如何在列表理解中做以下操作?与其他通过列表理解

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

+0

@Jblasco:谢谢,我的第一次尝试是'尝试3',只有但没有正确的顺序,因为jaco提到 – WoodChopper

回答

10

if需要在年底,而你没有需要列表comp中的pass rehension。只有符合if条件时才会添加项目,否则元素将被忽略,因此pass隐式实现在列表理解语法中。

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

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

[['abc', 1]] 
+0

谢谢!我浪费了30分钟到处搜索:) – WoodChopper

3

为补充雅科的答案;它是好的,知道了filter命令,因为你基本上要的是过滤列表:

filter(lambda x: x[0]=='abc', test) 

返回:

  • 一个在Python 2
  • 在Python3发电机(名单这对于很长的列表可能很有用,因为您可以稍后处理结果而不会使内存负担过重);如果您仍然需要列表,请使用list()构造函数将上面的filter函数包装起来。