【问题标题】:Python: finding the indices of a list that match the given sublistPython:查找与给定子列表匹配的列表索引
【发布时间】:2013-03-28 16:30:34
【问题描述】:

假设有两个 Python 列表:

my_list = ['a', 'bb', 'c', 'bb', 'cc', 'bbc']
sublist = ['bb', 'bb', 'bbc']

显然,sublist 由 *my_list* 的第 1 个、第 3 个和第 5 个元素组成。现在我想得到 给定这两个列表,索引[1, 3, 5]。有什么简单的方法吗?

注意:

  1. 列表可以有相同的元素。
  2. 子列表维护原始列表中元素的顺序。

【问题讨论】:

  • 你有没有尝试过?
  • @Blender 这是“你试过什么”的新解决方法吗?
  • @jamylak:这似乎是一个类似家庭作业的问题,所以我想问一下。
  • 我把名字改成了my_list,这样你就不会隐藏内置的python列表了
  • @thg435 在我的应用场景中(上面描述的简化了),不会出现你说的情况。不过谢谢提这个问题,比较有意思。

标签: python list indexing


【解决方案1】:

您可以使用生成器:

def indices(lst, items):
    last_index = 0

    for item in items:
        last_index += lst.index(item, last_index + 1) + 1

        yield last_index

【讨论】:

    【解决方案2】:

    我最喜欢 Blender 的回答。但我认为 index() 函数没有参数“start”,所以我在下面进行了一些修改。

    idx = 0
    start = 0
    for i in sublist:
        idx = my_list[start:].index(i) + start
        start = idx + 1
        yield idx
    

    【讨论】:

    • 一开始和你的类似,是的开始参数不是虚构的。自己试试吧
    • 其实你在一个注释上是正确的,start 不是关键字参数,但它绝对是一个参数,我现在已经在 Blender 的回答中修复了它
    【解决方案3】:

    我的解决方案

    def getIndex(list, sublist):
        index = []
        j = 0;
        for i in range(len(list)):
            if(sublist[j] == list[i]):
                index.append(i)
                j += 1
    
        return index
    

    它的工作原理是什么?

    $ python -i p.py 
    >>> getIndex(['bb', 'aa', 'bb'], ['aa', 'bb'])
    [1, 2]
    >>> getIndex(['a', 'bb', 'c', 'bb', 'cc', 'bbc'], ['bb', 'bb', 'bbc'])
    [1, 3, 5]
    >>> getIndex(['a', 'bb', 'c','bbc', 'bb', 'cc', 'bbc'], ['bb', 'bb', 'bbc'])
    [1, 4, 6]
    

    如果我仍然错了,请有人告诉我。

    【讨论】:

      【解决方案4】:

      @Blender 的方法非常适合列表(这是所有这些问题所需要的),这种方法更适用于所有可迭代对象

      >>> def indices(a, b): # find indices of items from b inside a
              enumerate_a = enumerate(a)
              for x in b:
                  for i, y in enumerate_a:
                      if x == y:
                          yield i
                          break
      
      
      >>> list(indices(['a', 'bb', 'c', 'bb', 'cc', 'bbc'], ['bb', 'bb', 'bbc']))
      [1, 3, 5]
      

      【讨论】:

      • 定义enumerate_a = enumerate(a)有什么用?
      • @MarkusMeskanen 因此,当它breaks 时,它会在下一个项目处恢复,而不是从头开始。这是因为 enumerate 返回一个迭代器。
      【解决方案5】:
      def get_indices(lst, sublist):
          result = []
          i = 0
          for x in sublist:
              result.append(lst.index(x, i))
              i = result[-1] + 1
          return result
      

      例子:

      >>> get_indices(['a', 'bb', 'c', 'bb', 'cc', 'bbc'], ['bb', 'bb', 'bbc'])
      [1, 3, 5]
      >>> get_indices(['a', 'bb', 'c', 'bb', 'cc', 'bbc'], ['c', 'bb', 'bbc'])
      [2, 3, 5]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2023-03-19
        • 1970-01-01
        • 2012-05-10
        • 2015-07-03
        • 2014-04-20
        相关资源
        最近更新 更多