我想要找到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)。 –