我想要找到A
中的第一个索引,其中包含的值为B
。例如:找到列表A中的第一个索引,其中值在列表中B
A = [1, 'Q', 3, 6, 'R']
B = ['Z', 'I', 'O', 3]
A.function(B) # would return 2
有没有简单的方法来做到这一点?很明显,您可以通过A
搜索B
中的每个项目并获取最小索引,但这比每个索引尝试全部B
要慢。
我想要找到A
中的第一个索引,其中包含的值为B
。例如:找到列表A中的第一个索引,其中值在列表中B
A = [1, 'Q', 3, 6, 'R']
B = ['Z', 'I', 'O', 3]
A.function(B) # would return 2
有没有简单的方法来做到这一点?很明显,您可以通过A
搜索B
中的每个项目并获取最小索引,但这比每个索引尝试全部B
要慢。
我认为有两大类方法,这取决于列表较长:
A
长于B
:
采取一个项目在A
的时间和看它是否在B
。重复,直到找到第一个。
next(index for index, item in enumerate(A) if item in B)
这是更有效的,如果B
转换为set
(感谢@khelwood),但一定要做到这一点,你开始,而不是生成表达式中之前。
B
长于A
:
查找在B
每个项目的A
索引,然后最小化:
indices = []
for item in B:
try:
indices.append(A.index(item))
except ValueError:
pass
min(indices)
请注意,您不能使用:
min(index for index in map(A.index, B) if index > -1)
(哎呀!),因为list
doe没有一种方法可以在没有错误的情况下获得索引(参见例如list.index() function for Python that doesn't throw exception when nothing found)。
@khelwood yep;编辑,谢谢 – jonrsharpe
做到这一点,最简单的方法是第一个列表中的每个元素迭代,并检查各是在第二个列表。
def firstInBoth(A, B):
for x in range(len(A)):
if A[x] in B:
return x
它取决于哪个列表比较长,关于是否查找每个项目的索引并取最小值比一次在项目上搜索“B”并查看它是否在'A'中快。 – jonrsharpe
总是找出每个项目的索引是O(A * B)。第二种方法是最坏情况下的O(A * B)和最好情况下的O(1)。 –