3

假设有两个 Python 列表:

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

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

注意:

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

5 回答 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
于 2013-04-06T06:39:06.847 回答
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]
于 2013-04-06T06:33:47.830 回答
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]
于 2013-04-06T06:43:00.563 回答
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]

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

于 2013-04-06T07:04:25.250 回答
0

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

idx = 0
start = 0
for i in sublist:
    idx = my_list[start:].index(i) + start
    start = idx + 1
    yield idx
于 2013-04-06T08:53:57.010 回答