Python:嵌套列表中元素的索引列表

时间:2010-03-09 00:53:06

标签: python indexing list nested

我知道我在找什么。我想让python告诉我它在哪个列表中。

这是一些伪代码:

item = "a"

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

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

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

4 个答案:

答案 0 :(得分:12)

在Python 2.6或更高版本中,

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

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

当然它也可以在旧版本的Python中完成,但不太方便,因为你没有指定你感兴趣的Python版本,我认为最好使用最新的生产 - 固体一个(如果你需要指定其他旧版本的Python,只需编辑你的答案)。

编辑:根据请求,让我试着解释一下这是如何工作的。我正在使用(新的2.6)内置函数next,特别是我正在调用next(iterator, default):返回迭代器的下一项(因此是第一项,因为这是第一次我们正在推进iterator),或者如果迭代器已经完成则默认值(如果它在我们推进它之前完成它意味着“空”;-)。默认情况下显然是-1,并且如果“a在任何子列表中都不存在”,则返回,这意味着在这种情况下与“迭代器为空”相同。

让我们再看一下迭代器:

(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)

您需要使用某种循环结构:

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

这将为您提供包含所需项目的所有子列表的生成器,并为您提供第一个。

答案 2 :(得分:0)

遍历列表以获取每个子列表。然后,检查项目是否在子列表中:

for i in range(0,len(list)):
    if whatYoureLookingFor in list[i]:
        print i

答案 3 :(得分:0)

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