Python 在列表中查找子列表的索引

Python 在列表中查找子列表的索引,python,list,nested-lists,Python,List,Nested Lists,正在尝试查找包含元素的子列表的索引。我不确定如何准确地指定问题(这可能是我在手册中忽略它的原因),但是我的问题是: list1 = [[1,2],[3,4],[7,8,9]] 我想在列表1中找到出现7的第一个子列表(在本例中,索引为2,但lll可能非常长)。(在这种情况下,每个数字只出现在一个子列表中,或者根本不出现。这些列表也只是整数列表) 例如,一个函数 spam = My_find(list1, 7) 将给出spam=2 我可以尝试循环生成布尔索引 [7 in x for x in l

正在尝试查找包含元素的子列表的索引。我不确定如何准确地指定问题(这可能是我在手册中忽略它的原因),但是我的问题是:

list1 = [[1,2],[3,4],[7,8,9]]
我想在列表1中找到出现7的第一个子列表(在本例中,索引为2,但lll可能非常长)。(在这种情况下,每个数字只出现在一个子列表中,或者根本不出现。这些列表也只是整数列表) 例如,一个函数

spam = My_find(list1, 7)
将给出spam=2 我可以尝试循环生成布尔索引

[7 in x for x in lll]
然后。索引以查找“true”-(根据) 然而,必须建立一个新的布尔列表确实是低效的

我的代码开始时list1相对较小,但它不断累积(最终将有100万个数字排列在大约5000个list1子列表中)

有什么想法吗

我可以尝试循环生成布尔索引

[7 in x for x in lll]
然后
.index
来找到“true”…然而,必须构建一个新的布尔列表确实是低效的

你离这里很近

首先,为了避免构建列表,使用生成器表达式而不是列表理解,只需将
[]
替换为
()

但是当你有一个任意的可数而不是一个列表时,你如何做
.index
的等价物呢?你可以使用
枚举
将每个值与其索引相关联,然后用
过滤器
dropwhile
或另一个生成器表达式过滤掉非七,然后
下一个
将为你提供e第一个
True
的索引和值

例如:

indexed_sevens = enumerate(sevens)
seven_indexes = (index for index, value in indexed_sevens if value)
first_seven_index = next(seven_indexes)
当然,如果你愿意的话,你可以把所有这些折叠成一个大的表达式

而且,如果您仔细想想,您实际上根本不需要该初始表达式;您可以在后面的过滤步骤中实现这一点:

first_seven_index = next(index for index, value in enumerate(lll) if 7 in value)
当然,如果没有seven,这将引发一个
StopIteration
异常,而不是
ValueError
表达式,但在其他情况下,它会执行与原始代码相同的操作,但不会构建列表,也不会在第一次匹配后继续测试值

first_seven_index = next(index for index, value in enumerate(lll) if 7 in value)