2010-03-09 168 views
10

我知道我在找什么。我想Python来告诉我这是在哪一个列表Python:嵌套列表中元素的索引列表

下面是一些伪代码:

item = "a" 

nested_list = [["a", "b"], ["c", "d"]] 

list.index(item) #obviously this doesn't work 

在这里我想蟒蛇返回0(因为“a”是在第一子列表中的一个元素更大的列表)。我不在乎它是哪个子元素。我不在乎是否有重复,例如[“a”,“b”,“a”]应该返回与上述示例相同的内容。

回答

1

你需要使用某种类型的循环结构:

next((sublist for sublist in mainlist if item in sublist)) 

这会给你包含所需项目的所有子列表发电机,给你的第一个。

+1

没错:这给子列表,而OP指定他们想要的子表的索引,正如我在回答返回。 – 2010-03-09 00:58:21

12

在Python 2.6或更好,

next((i for i, sublist in enumerate(nested_list) if "a" in sublist), -1) 

假设例如如果'a'不存在于任何子列表中,则需要-1结果。

当然,它也可以在老版本的Python中完成,但不是很容易,因为您没有指定您感兴趣的Python版本,所以我认为最好使用最新的基于生产的产品 - 固定的(如果您需要指定其他旧版本的Python,请编辑您的答案)。

编辑:根据要求,让我试着解释这是如何工作的。我使用内置函数next(特别是我打电话给next(iterator, default)):返回迭代器的下一个项目(因此第一个,因为这是我们第一次推进该迭代器),或者迭代器完成时的默认值(如果在完成之前完成,则表示“空”;-)。默认显然是-1,如果“a不存在于任何子列表”中,则返回-1,这意味着在这种情况下与“迭代器为空”相同。

让我们看看再迭代器:

(i for i, sublist in enumerate(nested_list) if "a" in sublist) 

的(四舍五入)括号内forif关键字,也就意味着这是一个生成器表达式,也很出名,简洁的genexp。 i(指数)和sublist(该指数的项目)超过enumerate(nested_list) - 如果我们在这里没有enumerate那么我们不会跟踪指数,但在这种情况下,我们确实需要它。只有当if子句得到满足时,才会考虑它们,即当您查找的元素出现在当前子列表中时。

所以这个genexp每次产​​生一个索引的每个值,使得该索引处的子列表满足条件"a" in sublist。由于我们在next内部使用它,我们只采用第一个这样的索引。

这个OP可能是合理的,因为认为一个神奇的内建人员在三个或四个字符中完成所有这些操作会更加方便 - 因此,对于这个非常具体的要求,我相信我以前从未见过超过十年的Python使用;然而,如果每一个这样的具体要求都有自己非常专业化的内建语言,那么内建的语言将会长于税法。相反,Python提供了许多低级别的“乐高积木”和一些方便的方法将它们组合在一起,以清晰(并且合理简洁地)表达解决方案,以组合大量的各种特定需求,如OP。

+1

由于他是编程新手,你会如此善意地解释这是如何工作的? :)不过,你有我的+1。 – 2010-03-09 01:00:53

+0

@musicfreak,当然,让我添加一些解释。 – 2010-03-09 01:04:53

+0

哇,很好的解释!如果可以的话,我会给你更多的选票! – 2010-03-09 06:58:00

0

迭代列表以获取每个子列表。然后,请检查该项目是在子表:

for i in range(0,len(list)): 
    if whatYoureLookingFor in list[i]: 
     print i 
0
>>> nested_list = [["a", "b"], ["c", "d"]] 
>>> item="a" 
>>> for o,sublist in enumerate(nested_list): 
...  if item in sublist: 
...   print o 
... 
0