gpt4 book ai didi

python - 在列表中查找子列表的索引

转载 作者:行者123 更新时间:2023-11-28 21:51:12 25 4
gpt4 key购买 nike

试图找到具有元素的子列表的索引。我不确定如何准确指定问题(这可能是我在手册中忽略它的原因),但我的问题是:

list1 = [[1,2],[3,4],[7,8,9]]

我想找到 list1 中出现 7 的第一个子列表(在本例中索引为 2,但 lll 可能非常非常长)。 (情况是每个数字将只出现在 1 个子列表中——或者根本不出现。而且这些只是整数列表)IE。像这样的功能

spam = My_find(list1, 7)

会给垃圾邮件= 2我可以尝试循环创建 bool 索引

[7 in x for x in lll]

然后 .index 找到“真”-(根据 Most efficient way to get indexposition of a sublist in a nested list )然而,必须建立一个新的 bool 列表确实效率低下..

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

有什么想法吗?

最佳答案

I could try looping to make a Boolean index

[7 in x for x in lll]

and then .index to find the 'true' … However surely having to build a new boolean list is really inefficient

你离这里很近了。

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

sevens = (7 in x for x in lll)

但是当你有一个任意的可迭代对象而不是一个列表时,你如何做等同于 .index 的事情呢?您可以使用 enumerate 将每个值与其索引相关联,然后使用 filterdropwhile 或其他生成器表达式过滤掉非七,然后 next 将为您提供第一个 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)

当然,如果没有七,这将引发 StopIteration 异常而不是 ValueError 表达式,但除此之外,它与您的原始代码做同样的事情,但是没有构建列表,也没有在第一次匹配后继续测试值。

关于python - 在列表中查找子列表的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30661645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com