Python 从另一个列表中查找编号的索引
我使用的是Python 3,代码中有两个列表:Python 从另一个列表中查找编号的索引,python,python-3.x,list,indexing,Python,Python 3.x,List,Indexing,我使用的是Python 3,代码中有两个列表: ListA = [53, 1, 17, 4, 13, 2, 17] ListB = [4, 3, 1] 现在,我想找到ListB中任何数字的索引,也就是ListA中的数字 这种情况下的输出应为1,因为: ListA中的第一个值也是ListB中的第一个值是1。 ListA中值1的索引为1。 设置交点以查找公共值。然后找到ListA中存在的所有索引,然后找到最小索引。如果不匹配,它将打印ListA的长度 set_inter =set(ListB).i
ListA = [53, 1, 17, 4, 13, 2, 17]
ListB = [4, 3, 1]
现在,我想找到ListB中任何数字的索引,也就是ListA中的数字
这种情况下的输出应为1,因为:
ListA中的第一个值也是ListB中的第一个值是1。
ListA中值1的索引为1。
设置交点以查找公共值。然后找到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
设置交点以查找公共值。然后找到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
在纯Python中,可以将生成器理解与next和enumerate一起使用: 注意,我们通过设置哈希值来优化查找成本。复杂度为Om+n,其中m和n分别为A和B中的元素数。若要在未找到匹配项的情况下处理错误,可以提供默认参数:
first_list = next((idx for idx, val in enumerate(A) if val in B_set), len(A))
如果您愿意使用第三方库,可以使用NumPy。如果不匹配,此处无错误处理:
import numpy as np
A = np.array([53, 1, 17, 4, 13, 2, 17])
B = np.array([4, 3, 1])
first_np = np.where(np.in1d(A, B))[0][0] # 1
在纯Python中,可以将生成器理解与next和enumerate一起使用: 注意,我们通过设置哈希值来优化查找成本。复杂度为Om+n,其中m和n分别为A和B中的元素数。若要在未找到匹配项的情况下处理错误,可以提供默认参数:
first_list = next((idx for idx, val in enumerate(A) if val in B_set), len(A))
如果您愿意使用第三方库,可以使用NumPy。如果不匹配,此处无错误处理:
import numpy as np
A = np.array([53, 1, 17, 4, 13, 2, 17])
B = np.array([4, 3, 1])
first_np = np.where(np.in1d(A, B))[0][0] # 1
可以使用以下生成器表达式:
next(i for i, a in enumerate(ListA) for b in ListB if a == b)
给定示例输入,返回:1您可以使用以下生成器表达式:
next(i for i, a in enumerate(ListA) for b in ListB if a == b)
给定您的示例输入,这将返回:1如果您想要更高的效率,可以将ListB转换为一个集合,以便确定ListB中的项目是否具有平均时间复杂度O1:
setB = set(ListB)
print(next(i for i, a in enumerate(ListA) if a in setB))
这将输出:1如果您想要更高的效率,您可以将ListB转换为一个集合,以便确定ListB中的某个项目是否具有平均时间复杂度O1:
setB = set(ListB)
print(next(i for i, a in enumerate(ListA) if a in setB))
这将输出:1您可以使用列表理解作为索引=[ListB.indexj for j in ListA if j in ListB][0]如果没有公共值,会发生什么?根据您的应用程序,np.in1d可能会很有用:输出应该是ListA或ListB中公共值的索引吗?感谢大家的快速响应,我将澄清我的问题。我想在ListA中找到与ListB 4、3或1中的任何数字匹配的索引。在我发布的示例中,数字1在ListB中,在ListA中是ListB中给定数字的第一个。预期输出为:2/或者如果ListA没有来自ListB的任何数字,则输出扩展为lenListA。希望我没有让你更加困惑,现在你可以使用列表理解作为索引=[ListB.indexj for j in ListA如果j in ListB][0]如果没有公共值会发生什么?根据你的应用程序,np.in1d可能会很有用:输出应该是ListA或ListB中公共值的索引吗?谢谢大家的快速响应,我会澄清我的问题。我想在ListA中找到与ListB 4、3或1中的任何数字匹配的索引。在我发布的示例中,数字1在ListB中,在ListA中是ListB中给定数字的第一个。预期输出为:2/或者如果ListA没有来自ListB的任何数字,则输出扩展为lenListA。希望我现在没有把你弄糊涂,很好,但是嵌套的for循环使复杂性变得很高,对吗?[其中m,n=lenA,lenB]。此外,索引应该引用A,而不是B。您应该枚举ListA而不是BListB@jpp是的,我写这个答案是为了快速给出答案我只是单独发布了一个更有效的答案。如果你愿意,你可以去看看。谢谢。很好,但是嵌套的for循环使复杂性变得很复杂,对吗?[其中m,n=lenA,lenB]。此外,索引应该引用A,而不是B。您应该枚举ListA而不是BListB@jpp是的,我写这个答案是为了快速给出答案我只是单独发布了一个更有效的答案。如果你愿意,你可以去看看。谢谢。numpy加1。如果您已经使用了数组,则非常方便,这样就不必将它们转换为集合或列表。也可以适应多维阵列。这工作非常好,非常感谢你的朋友+努比1。如果您已经使用了数组,则非常方便,这样就不必将它们转换为集合或列表。也可以适应多维阵列。这工作非常好,非常感谢你的朋友!