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

3
假设有两个Python列表:
my_list = ['a', 'bb', 'c', 'bb', 'cc', 'bbc']
sublist = ['bb', 'bb', 'bbc']

显然,sublist 由 *my_list* 的第1、3和5个元素组成。现在我想得到这两个列表,即 [1, 3, 5] 的索引。有没有简单的方法来做到这一点?

请注意:

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

1
你尝试过什么吗? - Blender
1
@Blender 这是新的“你尝试过什么”的解决方法吗? - jamylak
@jamylak:这个问题看起来像是作业题,所以我想问一下。 - Blender
我将名称更改为my_list,这样您就不会遮蔽内置的Python列表。 - jamylak
考虑 list=aXaZaXaYaZsublist=XYZ - 它应该返回什么? - georg
1
@thg435 在我的应用场景中(如上述描述所简化的),你提到的情况不会发生。但是感谢你提出这个问题,它更有趣。 - Ida
5个回答

3
您可以使用一个生成器:
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的方法非常适用于列表(这是此问题所涉及的所有内容),而这种方法则更适用于所有可迭代对象。
>>> 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) 是什么意思? - user2032433
1
@MarkusMeskanen 当 break 时,它会在下一项继续而不是从头重新开始。这是因为 enumerate 返回迭代器。 - jamylak

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

0

我的解决方案

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]

请问有人能告诉我是否还错了吗?


0

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

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

一开始它和你的很相似,而且是的,起始参数并不是虚构的。你可以自己试试。 - jamylak
实际上,您在一个方面是正确的,start不是关键字参数,但它绝对是一个参数,我已经在Blender的答案中修复了它。 - jamylak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接