2015-02-09 138 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']]