【问题标题】:Find index of a sublist in a list在列表中查找子列表的索引
【发布时间】:2015-06-05 08:17:49
【问题描述】:

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

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

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

这样的函数
spam = My_find(list1, 7)

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

[7 in x for x in lll]

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

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

有什么想法吗?

【问题讨论】:

    标签: python list nested-lists


    【解决方案1】:

    我可以尝试循环创建布尔索引

    [7 in x for x in lll]
    

    然后.index 找到“真”……但是必须建立一个新的布尔列表确实效率很低

    你离这里很近。

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

    sevens = (7 in x for x in lll)
    

    但是当你有一个任意的可迭代对象而不是一个列表时,你如何做相当于.index 的操作?您可以使用enumerate 将每个值与其索引相关联,然后只需使用filterdropwhile 或其他生成器表达式过滤掉非七,然后next 将为您提供第一个@ 的索引和值987654331@.

    例如:

    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 表达式,但除此之外,它与您的原始代码执行相同的操作,但不会构建列表,也不会继续测试第一次匹配后的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2014-10-13
      • 1970-01-01
      相关资源
      最近更新 更多