我正在使用Python 3,并且我的代码中有两个列表:
ListA = [53, 1, 17, 4, 13, 2, 17]
ListB = [4, 3, 1]
现在,我想在ListA中找到ListB中任何数字的索引。
在这种情况下,输出应为1
,因为:
ListA
和ListB
中的第一个值为1
。1
中值ListA
的索引是1
。答案 0 :(得分:2)
在纯Python中,您可以对next
和enumerate
使用生成器理解:
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
请注意,我们通过B
对set
中的值进行了哈希处理,以优化查找成本。复杂度为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