首页 > 解决方案 > 查找与另一个列表对应的元素的索引

问题描述

我有一个字符串列表:ls = ['a','b','c']另一个字符串更大,保证包含一个且仅包含一个来自ls:的字符串ls2 = ['1298a', 'eebbbd', 'qcqcq321']"

对于来自 的给定字符串,我如何找到来自ls2的相应字符串的索引是什么ls

我可以用:

for s in ls:
    for ss in ls2:
        if s in ss:
            print (s,ss,ls.index(s))

a 1298a 0
b eebbbd 1
c qcqcq321 2

但它有更好的东西吗?

编辑(希望它澄清):

我正在处理的实际案例有一个更大的第一个列表和一个较小的第二个:

ls  = ['apo','b','c','d25','egg','f','g']
ls2 = ['apoip21', 'oiujohuid25']

我想得到结果0,3,因为第 1 项ls2有第 1 项ls,而第 2项ls2有第 4项ls

标签: pythonstringlist

解决方案


如果没有有关您的数据的更多信息,您似乎无法摆脱O(m * n * p)复杂性(where m = len(ls), n = len(ls2), )。您绝对可以通过使用跟踪当前索引来p = max(map(len, ls2))减少当前循环。另外,不要忘记提前终止:O(m2 * n * p)enumerate

for string in ls2:
    for index, key in enumerate(ls):
        if key in string:
            print(key, string, index)
            break

请注意,我交换了内部和外部循环以使break工作正常:您肯定要检查 的每个元素ls2,但只检查ls.

以下是我在此处介绍的不同解决方案上积累的一些时间O(m * n * p)。感谢@thierry-lathuille 提供测试数据:

ls = ['g', 'j', 'z', 'a', 'rr', 'ttt', 'b', 'c', 'd', 'f']
ls2 = ['1298a', 'eebbb', 'qcqcq321', 'mlkjmd', 'dùmlk', 'lof',
       'erreee', 'bmw', 'ottt', 'jllll', 'lla' ]

def with_table():
    table = {key: index for index, key in enumerate(ls)}
    result = {}
    for string in ls2:
        for key in ls:
            if key in string:
                result[string] = table[key]
    return result

def with_enumerate():
    result = {}
    for string in ls2:
        for index, key in enumerate(ls):
            if key in string:
                result[string] = index
                break
    return result

def with_dict_comp():
    return {string: index for string in ls2 for index, key in enumerate(ls) if key in string}

def with_itertools():
    result = {}
    for (index, key), string in itertools.product(enumerate(ls), ls2):
        if key in string:
            result[string] = index
    return result

%timeit with_table()
4.89 µs ± 61.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit with_enumerate()
5.27 µs ± 66.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit with_dict_comp()
6.9 µs ± 83.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit with_itertools()
17.5 ns ± 0.193 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

事实证明,为索引创建查找表比使用enumerate.


推荐阅读