Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:查找与给定子列表匹配的列表索引_Python_List_Indexing - Fatal编程技术网

Python:查找与给定子列表匹配的列表索引

Python:查找与给定子列表匹配的列表索引,python,list,indexing,Python,List,Indexing,假设有两个Python列表: my_list = ['a', 'bb', 'c', 'bb', 'cc', 'bbc'] sublist = ['bb', 'bb', 'bbc'] 显然,子列表由*my_list*的第1、第3和第5个元素组成。现在我想得到 给定这两个列表,索引[1,3,5]。有什么简单的方法可以做到这一点吗 请注意: 列表可以有相同的元素 子列表维护原始列表中元素的顺序 @Blender的方法适用于列表(这就是这个问题所涉及的全部内容),这种方法更适用于所有iterables

假设有两个Python列表:

my_list = ['a', 'bb', 'c', 'bb', 'cc', 'bbc']
sublist = ['bb', 'bb', 'bbc']
显然,子列表由*my_list*的第1、第3和第5个元素组成。现在我想得到 给定这两个列表,索引
[1,3,5]
。有什么简单的方法可以做到这一点吗

请注意:

  • 列表可以有相同的元素
  • 子列表维护原始列表中元素的顺序
    @Blender的方法适用于列表(这就是这个问题所涉及的全部内容),这种方法更适用于所有iterables

    >>> 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]
    

    您可以使用生成器:

    def indices(lst, items):
        last_index = 0
    
        for item in items:
            last_index += lst.index(item, last_index + 1) + 1
    
            yield last_index
    
    示例:

    >>> 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]
    
    我的解决方案

    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]
    

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

    我最喜欢搅拌机的答案。但我认为index()函数没有参数“start”,所以我在下面做了一些修改

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

    你试过什么吗?@Blender这是“你试过什么”的新解决方法吗?@jamylak:这似乎是一个像家庭作业一样的问题,所以我想问一下。我把名字改成了
    my_list
    ,这样你就不会影响内置python了list@thg435在我的应用场景中(在上面的描述中进行了简化),你提到的案子不会发生。但是感谢您提到这个更有趣的问题。定义
    enumerate_a=enumerate(a)
    有什么用?@MarkusMeskanen所以当它
    中断时,它会在下一项中恢复,而不是从一开始就重新启动。这是因为
    enumerate
    返回一个迭代器。它与您的迭代器类似,而且开始参数不是虚构的。你自己试试看事实上你有一点是正确的,
    start
    不是一个关键字参数,但它肯定是一个参数,我已经在Blender的答案中修复了它
    idx = 0
    start = 0
    for i in sublist:
        idx = my_list[start:].index(i) + start
        start = idx + 1
        yield idx