2016-07-06 123 views
1

我想要找到A中的第一個索引,其中包含的值爲B。例如:找到列表A中的第一個索引,其中值在列表中B

A = [1, 'Q', 3, 6, 'R'] 
B = ['Z', 'I', 'O', 3] 
A.function(B) # would return 2 

有沒有簡單的方法來做到這一點?很明顯,您可以通過A搜索B中的每個項目並獲取最小索引,但這比每個索引嘗試全部B要慢。

+0

它取決於哪個列表比較長,關於是否查找每個項目的索引並取最小值比一次在項目上搜索「B」並查看它是否在'A'中快。 – jonrsharpe

+0

總是找出每個項目的索引是O(A * B)。第二種方法是最壞情況下的O(A * B)和最好情況下的O(1)。 –

回答

4

我認爲有兩大類方法,這取決於列表較長:

  1. A長於B

    採取一個項目在A的時間和看它是否在B。重複,直到找到第一個。

    next(index for index, item in enumerate(A) if item in B) 
    

    這是更有效的,如果B轉換爲set(感謝@khelwood),但一定要做到這一點,你開始,而不是生成表達式中之前。

  2. 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)。

+0

@khelwood yep;編輯,謝謝 – jonrsharpe

0

做到這一點,最簡單的方法是第一個列表中的每個元素迭代,並檢查各是在第二個列表。

def firstInBoth(A, B): 
    for x in range(len(A)): 
     if A[x] in B: 
      return x 
相關問題