【问题标题】:In python, given a list of lists, how do you identify the index of a matching element?在python中,给定一个列表列表,你如何识别匹配元素的索引?
【发布时间】:2026-02-02 19:15:01
【问题描述】:
>>> birds = ['duck', 'chicken', 'goose']
>>> cats = ['tiger', 'lion']
>>> humans = ['human']
>>> at_the_zoo = [birds, cats, humans]

给定一个像 at_the_zoo 这样的列表列表,我如何找到 Tiger 所在的列表?

for animal in sum(at_the_zoo, []):
    if "tiger" == animal:
        print "1 help!"

例如,我可以在动物列表中找到老虎,如果我使用枚举,它会告诉我它位于索引 3。我如何确定它是 at_the_zoo 列表的元素 1 的一部分。 搜索鸭子会告诉我元素 0 等。

谢谢!

【问题讨论】:

  • 我认为链接的答案并不是真正的重复。另一个问题有任意嵌套,这是一层嵌套。每个人的更好答案是不同的。我提名重新开放...

标签: python list enumerate


【解决方案1】:

我认为是这样的:

def find_element(nested_lst, what):
    for idx, sublst in enumerate(nested_lst):
        try:
            idx2 = sublst.index(what)
            return (idx, idx2)
        except ValueError:
            pass

应该可以。

示例:

>>> def find_element(nested_lst, what):
...     for idx, sublst in enumerate(nested_lst):
...         try:
...             idx2 = sublst.index(what)
...             return (idx, idx2)
...         except ValueError:
...             pass
... 
>>> birds = ['duck', 'chicken', 'goose']
>>> cats = ['tiger', 'lion']
>>> humans = ['human']
>>> find_element([birds, cats, humans], 'human')
(2, 0)
>>> find_element([birds, cats, humans], 'gator')  # returns None if not found.
>>> find_element([birds, cats, humans], 'tiger')
(1, 0)

值得注意的是,平均而言,list.index 是一个 O(N) 操作,这意味着列表不是用于测试成员资格的最有效的数据结构。如果您的实际数据支持它,则可能值得考虑使用set

【讨论】:

  • 请注意,如果您只关心包含whatsublst 的索引,而不是sublst 内的what 的索引,您可以直接说if what in sublst: return idx,而不是将try/except 块与sublst.index 结合使用。它不会改变效率,但可以说看起来更好一些。
  • @dano -- 公平点。出于某种原因,我的印象是 OP 两者都想要。
  • 我喜欢这个答案,因为它指向集合数据结构,这可能是正确的使用方法。 dano 建议编辑的解决方案奏效了! :) 如果可能的话,我会在 dano 的建议中进行编辑。否则谢谢!在我的程序中,我最终坚持使用列表
【解决方案2】:

只需建立一个索引:

>>> birds = ['duck', 'chicken', 'goose']
>>> cats = ['tiger', 'lion']
>>> humans = ['human']
>>> at_the_zoo = [birds, cats, humans]
>>> index = {}
>>> for i, arr in enumerate(at_the_zoo):
...   index.update(zip(arr, [i]*len(arr)))
...
>>> index
{'tiger': 1, 'goose': 0, 'lion': 1, 'human': 2, 'duck': 0, 'chicken': 0}
>>> index.get('tiger')
1
>>>

或者:

>>> for i, arr in enumerate(at_the_zoo):
...   arr_len = len(arr)
...   index.update(zip(arr, zip([i]*arr_len, range(arr_len))))
...
>>> from pprint import pprint
>>> pprint(index)
{'chicken': (0, 1),
 'duck': (0, 0),
 'goose': (0, 2),
 'human': (2, 0),
 'lion': (1, 1),
 'tiger': (1, 0)}
>>> index.get('tiger')
(1, 0)

【讨论】:

    【解决方案3】:

    找到了两个发布的答案,但@newtover 的答案对我来说有点神秘,@mgilson 没有按要求回答问题。让我试一试。

    def find_in_inner(lst, target):
        for i, sublst in enumerate(lst):
            if target in sublst:
                return i
    
    >>> birds = ['duck', 'chicken', 'goose']
    >>> cats = ['tiger', 'lion']
    >>> humans = ['human']
    >>> at_the_zoo = [birds, cats, humans]
    >>> find_in_inner(at_the_zoo, "tiger")
    1
    

    【讨论】:

      【解决方案4】:

      对于列表列表的特定情况,如果您想要一个子列表编号的元组并索引到该子列表,您可以这样做:

      [(i,j) for i, sl in enumerate(LoL) for j,e in enumerate(sl) if e==tgt]
      

      演示:

      >>> birds = ['duck', 'chicken', 'goose']
      >>> cats = ['tiger', 'lion']
      >>> humans = ['human']
      >>> zoo = [birds, cats, humans]
      >>> tgt='lion'
      >>> [(i,j) for i, sl in enumerate(zoo) for j,e in enumerate(sl) if e==tgt]
      [(1, 1)]
      

      正确处理子列表中多个目标的潜在情况。

      如果你知道你只关心第一个实例,你可以这样做:

      [(i,sl.index(tgt)) for i, sl in enumerate(zoo) if tgt in sl] 
      

      如果您不在乎消除重复并且需要快速访问,则可以建立索引:

      {e:(i,j) for i, sl in enumerate(zoo) for j, e in enumerate(sl)}
      # {'tiger': (1, 0), 'goose': (0, 2), 'lion': (1, 1), 'human': (2, 0), 'duck': (0, 0), 'chicken': (0, 1)}
      

      假设在每种情况下都有一个名为“bob”的人、猫和鸟:

      birds = ['duck', 'chicken', 'goose', 'bob']
      cats = ['tiger', 'lion','bob']
      humans = ['human','bob']
      

      您可以通过这种方式构造一个索引,以正确处理多个子列表中的多个条目:

      index={}
      for i, sl in enumerate(zoo):
          for j, item in enumerate(sl):
              index.setdefault(item, []).append((i,j))
      

      索引变为:

        {'tiger': [(1, 0)], 
         'goose': [(0, 2)], 
         'lion': [(1, 1)], 
         'human': [(2, 0)], 
         'duck': [(0, 0)], 
         'chicken': [(0, 1)], 
         'bob': [(0, 3), (1, 2), (2, 1)]}
      

      【讨论】: