从另一个列表中查找数字索引

时间:2018-10-03 15:48:36

标签: python python-3.x list indexing

我正在使用Python 3,并且我的代码中有两个列表:

ListA = [53, 1, 17, 4, 13, 2, 17]
ListB = [4, 3, 1]

现在,我想在ListA中找到ListB中任何数字的索引。

在这种情况下,输出应为1,因为:

  • ListAListB中的第一个值为1
  • 1中值ListA的索引是1

4 个答案:

答案 0 :(得分:2)

在纯Python中,您可以对nextenumerate使用生成器理解:

A = [53, 1, 17, 4, 13, 2, 17]
B = [4, 3, 1]
B_set = set(B)

first_lst = next(idx for idx, val in enumerate(A) if val in B_set)  # 1

请注意,我们通过Bset中的值进行了哈希处理,以优化查找成本。复杂度为O( m + n ),其中 m n 是{{1}中元素的数量}和A。要在找不到匹配项的情况下进行错误处理,可以提供默认参数:

B

如果您愿意使用第三方库,则可以使用NumPy。在没有匹配的情况下,这里没有错误处理:

first_list = next((idx for idx, val in enumerate(A) if val in B_set), len(A))

答案 1 :(得分:1)

您可以使用以下生成器表达式:

next(i for i, a in enumerate(ListA) for b in ListB if a == b)

给出示例输入,返回:1

答案 2 :(得分:1)

如果要提高效率,可以将ListB转换为集合,以便确定某项是否在ListB中,平均时间复杂度为O(1):

setB = set(ListB)
print(next(i for i, a in enumerate(ListA) if a in setB))

这将输出:1

答案 3 :(得分:0)

设置交点以找到常用值。然后找到ListA中存在的所有索引,然后找到最小索引。如果没有匹配项,则会打印ListA的长度

set_inter =set(ListB).intersection(ListA)

if set_inter: # if there is a common value
    idx_A=min([ListA.index(i) for i in set_inter])
    print(idx_A)
else:
    print(len(ListA)) # print the length of ListA