【问题标题】:Python: Indexing list for element in nested listPython:嵌套列表中元素的索引列表
【发布时间】:2011-01-25 05:50:41
【问题描述】:

我知道我在寻找什么。我想让 python 告诉我它在哪个列表中。

这是一些伪代码:

item = "a"

nested_list = [["a", "b"], ["c", "d"]]

list.index(item) #obviously this doesn't work

在这里,我希望 python 返回 0(因为“a”是较大列表中第一个子列表中的一个元素)。我不在乎它是哪个子元素。我不在乎是否有重复,例如 ["a", "b", "a"] 应该返回与上面示例相同的内容。

【问题讨论】:

    标签: python indexing list nested


    【解决方案1】:

    在 Python 2.6 或更高版本中,

    next((i for i, sublist in enumerate(nested_list) if "a" in sublist), -1)
    

    假设例如如果'a' 不存在于任何子列表中,您需要-1 结果。

    当然它也可以在旧版本的 Python 中完成,但不是那么方便,而且由于您没有指定您感兴趣的 Python 版本,我认为最好使用最新的生产实体一个(如果您需要指定其他较旧版本的 Python,只需编辑您的答案)。

    编辑:根据请求,让我尝试解释一下这是如何工作的。我正在使用(2.6 中的新功能)内置函数next,特别是我正在调用next(iterator, default):返回迭代器的下一项(因此是第一项,因为这是我们第一次推进该迭代器),或者如果迭代器已完成,则为默认值(如果它在我们推进它之前完成,则意味着“空”;-)。默认值显然是-1,如果“a 不存在于任何子列表中”则返回,这意味着在这种情况下与“迭代器为空”相同。

    让我们再看一遍迭代器:

    (i for i, sublist in enumerate(nested_list) if "a" in sublist)
    

    (圆括号)和forif 关键字表示这是一个生成器表达式,也简称为genexp。 i(索引)和sublist(该索引处的项目)超过enumerate(nested_list)——如果我们没有enumerate,那么我们就不会跟踪索引,但是在这个如果我们确实需要它。仅当满足 if 子句时才会考虑它们,也就是说,当您要查找的元素存在于当前子列表中时。

    所以这个 genexp 一次生成一个索引的每个值,使得该索引处的子列表满足条件"a" in sublist。由于我们在next 中使用它,所以我们只取第一个这样的索引。

    OP 可能有理由认为一个神奇的内置函数在三个或四个字符中完成所有这些操作会更方便——对于这个非常具体的要求,它会更方便,我相信我以前从未遇到过使用 Python 十年;但是,如果每个这样的特定要求都有自己非常专业的内置语言,那么内置语言将变得比税法更大。取而代之的是,Python 提供了许多较低级别的“乐高积木”和一些方便的方式将它们组合在一起,以清晰地(并且相当简洁地)表达对各种特定要求(如 OP 的组合)的解决方案。

    【讨论】:

      【解决方案2】:
      >>> nested_list = [["a", "b"], ["c", "d"]]
      >>> item="a"
      >>> for o,sublist in enumerate(nested_list):
      ...     if item in sublist:
      ...         print o
      ...
      0
      

      【讨论】:

        【解决方案3】:

        遍历列表以获取每个子列表。然后,检查该项目是否在子列表中:

        for i in range(0,len(list)):
            if whatYoureLookingFor in list[i]:
                print i
        

        【讨论】:

          【解决方案4】:

          您需要使用某种循环结构:

          next((sublist for sublist in mainlist if item in sublist))
          

          这将为您提供包含所需项目的所有子列表的生成器,并为您提供第一个。

          【讨论】:

          • 是的:这给出了子列表,而 OP 指定他们想要该子列表的索引,正如我在回答中返回的那样。
          猜你喜欢
          • 2016-02-29
          • 1970-01-01
          • 2023-02-04
          • 2017-04-18
          • 1970-01-01
          • 2013-01-17
          • 2023-02-06
          • 1970-01-01
          • 2013-12-18
          相关资源
          最近更新 更多