2015-11-13 61 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函數包裝起來。