2015-02-09 78 views
0

假設我有列表A,定義爲[['foo',1],['bar',2]]。我如何找到其中有'foo'A裏面的列表?搜索列表元素內部列表[Python 3]

+0

好吧,讓我們備份:如果我們有一個列表,你怎麼了知道一個元素是否在它內部? – 2015-02-09 22:31:39

+0

如果表達式「if元素在列表中」返回「True」。 – 2015-02-09 22:33:24

+0

好吧,那麼如何遍歷列表清單以查看最內層是否有內容? – 2015-02-09 22:35:49

回答

4

使用生成器表達式來測試每個子列表。既然我們只想要第一個,我們可以在genexp上使用next()函數。

A = [['foo', 1], ['bar', 2]] 
a = next(x for x in A if "foo" in x) 

這給你自己的子列表。如果您希望子列表的索引改爲:

a = next(i for i, x in enumerate(A) if "foo" in x) 

請注意,您可能實際上並不需要該索引。你可以做大部分事情,你只需要擁有列表對象。例如,如果你想完全用["baz", 3]更換子列表,你可以在上面做一個切片賦值:

a = next(x for x in A if "foo" in x) 
a[:] = ["baz", 3] 

無論哪種配方,你如果找不到搜索項獲得StopIteration例外。您可以使用next()的第二個參數來返回None或其他內容。在這種情況下,你必須把括號圍繞genexp:

a = next((x for x in A if "foo" in x), None) 
+0

[:]和列表(a)之間是否有任何偏好?我通常選擇後者 – user3684792 2015-02-09 22:39:29

+0

在'='符號的左側,'a [:]'是一個切片分配,而不是一個副本。 'list(a)'不會在'='的左邊工作。對於複製列表,「a [:]」比「list(a)」稍快,但在大多數情況下你可能不會注意到。在這種情況下,我會說這個問題是個人風格問題。任何有能力的Python程序員都會認爲它是一個副本。 – kindall 2015-02-09 22:40:22

2

只是使事情變得複雜起來,你可以使用filter

>>> a = [['foo',1],['bar',2]] 
>>> list(filter(lambda x:'foo'in x , a)) 
[['foo', 1]] 
>>> a = [['foo',1],['bar',2],[1,'foo']] 
>>> list(filter(lambda x:'foo'in x , a)) 
[['foo', 1], [1, 'foo']]