Python:在嵌套列表中索引元素的列表
我知道我想要什么。我想让Python告诉我某个元素在列表中的位置。
下面是一些伪代码:
item = "a"
nested_list = [["a", "b"], ["c", "d"]]
list.index(item) #obviously this doesn't work
在这里,我希望Python返回0(因为“a”是大列表中第一个子列表的一个元素)。我不在乎它是哪个子元素。我也不在乎是否有重复,比如说,["a", "b", "a"]应该和上面的例子返回一样的结果。
4 个回答
遍历这个列表,获取每一个子列表。然后,检查这个项目是否在子列表中:
for i in range(0,len(list)):
if whatYoureLookingFor in list[i]:
print i
你需要使用某种循环结构:
next((sublist for sublist in mainlist if item in sublist))
这样可以生成一个包含你想要的项目的所有子列表,并且会给你第一个子列表。
在 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)
:这个函数返回迭代器的下一个项目(因此这是第一次推进迭代器,所以返回的是第一个),如果迭代器已经结束,则返回默认值(如果在我们推进之前就结束了,那就意味着“空”)。默认值显然是 -1
,如果“a
在任何子列表中都不存在”,这就意味着在这种情况下“迭代器是空的”。
我们再看看迭代器:
(i for i, sublist in enumerate(nested_list) if "a" in sublist)
括号和 for
、if
关键字表示这是一个生成器表达式,简写为 genexp。i
(索引)和 sublist
(该索引的项目)是通过 enumerate(nested_list)
来推进的——如果这里没有 enumerate
,我们就无法跟踪索引,但在这种情况下我们确实需要它。只有在 if
条件满足时,才会考虑它们,也就是说,当你要找的元素出现在当前子列表中时。
所以这个生成器表达式一次产生一个索引值,只有当该索引的子列表满足条件 "a" in sublist
时才会产生。因为我们在 next
中使用它,所以只取第一个满足条件的索引。
提问者可能会觉得有一个神奇的内置函数用三四个字符就能完成所有这些会更方便——确实如此,针对这个非常具体的需求,我相信在我使用 Python 十多年中从未遇到过;然而,如果每个这样的具体需求都有自己非常专业的内置函数,语言和内置函数的数量将会比税法还要庞大。相反,Python 提供了许多低级的“乐高积木”,以及几种方便的方式将它们组合在一起,以清晰(且相对简洁)地表达解决方案,适用于各种具体需求,就像提问者的需求一样。