#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]