如何从列表 a 中找到变量 b 的索引?

How do I find the index of variable b from list a?

如何从列表a中找到变量b的索引? 我怀疑问题出在数据类型上。


a=[-202516736, '-202516736', '13886', '678280946', '14514', '330251838', '14511', '639566631', '14510', '542472303', '14506']
b=['678280946']
a_INT = [int(item) for item in a]
b_INT = [int(item) for item in b]

j = 0
while True:
    try:
        i = a_INT.index(b_INT, j)
        print(i)
        j = i + 1
    except:
        break

a=[-202516736, '-202516736', '13886', '678280946', '14514', '330251838', '14511', '639566631', '14510', '542472303', '14506']
b=['678280946']
for item in b:
  print(a.index(item))

由于 b 只有一个元素,所以输出为 3。

让我们更进一步,向 b 列表添加另一个值,并在 a 列表中添加一个副本。那么:

a=[-202516736, '-202516736', '13886', '678280946', '14514', '678280946', '330251838', '14511', '639566631', '14510', '542472303', '14506']
b=['678280946', 13886]

ai = list(map(int, a))

for n in map(int, b):
    offset = 0
    r = []
    while True:
        try:
            i = ai[offset:].index(n)
            r.append(offset+i)
            offset += i + 1
        except ValueError:
            break
    print(f'{n} occurs at {r}')

输出:

678280946 occurs at [3, 5]
13886 occurs at [2]

版本 2:

第一段代码在功能上是正确的。但是,如果正在搜索的列表非常大,效率可能会非常低。

Python的built-in排序功能非常快。因此,让我们构建一个二元组列表,每个元组由列表中的一个值及其原始索引组成。然后对新列表进行排序。现在它已排序,我们可以执行二进制搜索并从那里继续。

出于演示目的向 OP 的原始列表添加了更多值:

a = [-202516736, '-202516736', '13886', '678280946', '14514', '678280946',
     '330251838', '14511', '639566631', '14510', '542472303', '14506', '678280946']
b = ['678280946', 13886, 14514, '-202516736', 99]


def bsearch(lst, x):
    L = 0
    R = len(lst) - 1
    while L <= R:
        m = (L + R) // 2
        if (v := lst[m][0]) == x:
            return m
        if v < x:
            L = m + 1
        else:
            R = m - 1
    return -1


def findall(list_, n):
    templist = sorted((v, i) for i, v in enumerate(list_))
    result = None
    if (i := bsearch(templist, n)) >= 0:
        result = [templist[i][1]]
        for j in range(i-1, -1, -1):
            if templist[j][0] != n:
                break
            result.append(templist[j][1])
        for j in range(i+1, len(templist)):
            if templist[j][0] != n:
                break
            result.append(templist[j][1])
    return result

ai = list(map(int, a))

for n in map(int, b):
    print(f'{n} -> {findall(ai, n)}')

输出:

678280946 -> [5, 3, 12]
13886 -> [2]
14514 -> [4]
-202516736 -> [0, 1]
99 -> None