2012-04-28 4 views
10

Для двух списков a и b, как я могу получить индексы значений, которые появляются в обоих? Например,сравнить два списка в python и вернуть индексы совпадающих значений

a = [1, 2, 3, 4, 5] 
b = [9, 7, 6, 5, 1, 0] 

return_indices_of_a(a, b) 

вернется [0,4] с (a[0],a[4]) = (1,5).

+0

Возможный дубликат [Python: как найти список пересечений?] (Http://stackoverflow.com/questions/3697432/python-how-to-find-list-intersection) – ChristopheD

+2

Не думаю, что этот вопрос дубликат этого, даже если он может быть аналогичным. – jamylak

ответ

18

Лучший способ сделать это - сделать b a set, поскольку вы проверяете только членство внутри него.

>>> a = [1, 2, 3, 4, 5] 
>>> b = set([9, 7, 6, 5, 1, 0]) 
>>> [i for i, item in enumerate(a) if item in b] 
[0, 4] 
+0

Спасибо большое! Что же касается этого случая: 'a = [1, 2, 9, 8]' и 'b = [1, 9, 1]' (b - подмножество a), где желаемый результат равен [[0, 2, 0 ] '(индексы соответствия каждому значению в b)? При создании b набор потеряет индекс второго «1», а также последовательность индексов. – user1342516

+0

В этом случае это не было бы [[0, 2, 0, 1, 2] 'или что-то подобное? (так как все элементы 'b' встречаются в обоих списках) – jamylak

+0

Я не был ясен ... Полученные« индексы », которые мне нужны в этом случае, дадут' array (a) [index] = b'. Я отредактировал вопрос. возможно, описание более ясное. – user1342516

5
def return_indices_of_a(a, b): 
    b_set = set(b) 
    return [i for i, v in enumerate(a) if v in b_set] 
2

Для больших списков это может быть помощь:

for item in a: 
index.append(bisect.bisect(b,item)) 
    idx = np.unique(index).tolist() 

Обязательно импортировать NumPy.