Определите индекс всех элементов в списке по сравнению с другим списком

#python #python-3.x

Вопрос:

Например, у меня есть список A :

 A = [100, 200, 300, 200, 400, 500, 600, 400, 700, 200, 500, 800]
 

И у меня есть список B :

 B = [100, 200, 200, 500, 600, 200, 500]
 

Мне нужно определить индекс элементов в B сравнении с A

Я пытался:

 list_index = [A.index(i) for i in B]
 

Он возвращается:

 [0, 1, 1, 5, 6, 1, 5]
 

Но что мне нужно, так это:

 [0, 1, 3, 5, 6, 9, 10]
 

Как я могу это решить?

Комментарии:

1. Нужно будет написать больше кода. Вы захотите отслеживать для каждого значения, какой последний индекс вы «использовали», и для следующего вхождения значения берите индекс после этого.

2. Вы имеете в виду [0, 1, 3, 5, 6, 9, 10] , то есть используете каждый элемент в A только один раз? И чего бы вы ожидали, например [500, 200] ?

3. @Nyps для [500,200] он должен вернуть [5,9]

4. Что делать, если один из них не включен или не в правильном порядке? например x = [800, 200, 500] , или y = [200, 500, 900]

Ответ №1:

Вы можете выполнить итерацию перечисления A , чтобы отслеживать индексы и получать значения, которым они соответствуют:

 A = [100,200,300,200,400,500,600,400,700,200,500,800]
B = [100,200,200,500,600,200,500]

def get_indices(A, B):
    a_it = enumerate(A)
    for n in B:
        for i, an in a_it:
            if n == an:
                yield i
                break
            
list(get_indices(A, B))
# [0, 1, 3, 5, 6, 9, 10]
 

Это позволяет избежать index() многократного использования.

Ответ №2:

Вы можете попробовать что-то вроде этого. Переместите оба списка и добавьте индекс, когда они будут равны:

 A = [100,200,300,200,400,500,600,400,700,200,500,800]

B = [100,200,200,500,600,200,500]

i, j = 0, 0
list_index = []
while j < len(B):
    if B[j] == A[i]:
        list_index.append(i)
        j  = 1
    i  = 1
print(list_index)
 

Выход:

[0, 1, 3, 5, 6, 9, 10]

Ответ №3:

Вы можете создать список, называемый индексами, и ввести в него первый индекс. Затем повторите остальные элементы B , затем возьмите фрагмент A из последнего индекса в indices списке и получите индекс элемента, добавьте его в последний индекс 1, затем добавьте его обратно в indices список.

 indices = [A.index(B[0])]
for i,v in enumerate(B[1:]):
    indices.append(A[indices[-1] 1:].index(v) indices[-1] 1)


#indices: [0, 1, 3, 5, 6, 9, 10]
 

Ответ №4:

Вот что я бы использовал:

 A=[100,200,300,200,400,500,600,400,700,200,500,800]
B=[100,200,200,500,600,200,500]

list_index = []
removedElements = 0

for i in B:
  indexInA = A.index(i)
  A.pop(indexInA)
  list_index.append(indexInA removedElements)
  removedElements =1

print(list_index)
 

Ответ №5:

 A = np.array([100,200,300,200,400,500,600,400,700,200,500,800])
B = [100, 200, 200, 500, 600, 200, 500]

idx = np.arange(len(A))
indices = {i: idx[A == i].tolist() for i in set(B)}
[indices[i].pop(0) for i in B]
 

Ответ №6:

Я перехожу через B и устанавливаю проверенный индекс равным None в A. Таким образом, код изменит A.

 A = [100, 200, 300, 200, 400, 500, 600, 400, 700, 200, 500, 800]
B = [100, 200, 200, 500, 600, 200, 500]

res = []
for i in B:
    res.append(A.index(i))
    A[A.index(i)] = None

print(res)
 

Выход:

 [0, 1, 3, 5, 6, 9, 10]