我知道我在找什么。我想让python告诉我它在哪个列表中。
这是一些伪代码:
item = "a"
nested_list = [["a", "b"], ["c", "d"]]
list.index(item) #obviously this doesn't work
这里我希望python返回0(因为“a”是较大列表中第一个子列表中的元素)。我不关心它是哪个子元素。我不在乎是否有重复,例如,[“a”,“b”,“a”]应该返回与上述示例相同的内容。
答案 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)
(圆形)括号和for
和if
关键字表示这是一个生成器表达式,也称为genexp简洁。 i
(索引)和sublist
(该索引处的项目)超过enumerate(nested_list)
- 如果我们在此处没有enumerate
那么我们就不会保留跟踪索引,但在这种情况下我们确实需要它。它们只在满足if
子句时才被考虑,也就是说,当您要查找的元素出现在当前子列表中时。
因此,这个genexp一次一个地产生索引的每个值,使得该索引处的子列表满足条件"a" in sublist
。由于我们在next
中使用它,我们只采用第一个这样的索引。
答案 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