Нахождение индекса номера из другого списка - PullRequest
0 голосов
/ 03 октября 2018

Я использую Python 3, и у меня есть два списка в моем коде:

ListA = [53, 1, 17, 4, 13, 2, 17]
ListB = [4, 3, 1]

Теперь я хочу найти индекс любого числа в ListB, который находится в ListA.

Выход в этом случае должен быть 1, потому что:

  • Первое значение в ListA, которое также находится в ListB, равно 1.
  • Индексзначение 1 в ListA равно 1.

Ответы [ 4 ]

0 голосов
/ 03 октября 2018

Если вы хотите повысить эффективность, вы можете превратить ListB в набор, чтобы вы могли определить, входит ли предмет в ListB со средней сложностью по времени O (1):

setB = set(ListB)
print(next(i for i, a in enumerate(ListA) if a in setB))

Это выводит: 1

0 голосов
/ 03 октября 2018

В чистом Python вы можете использовать генераторное понимание с next и enumerate:

A = [53, 1, 17, 4, 13, 2, 17]
B = [4, 3, 1]
B_set = set(B)

first_lst = next(idx for idx, val in enumerate(A) if val in B_set)  # 1

Обратите внимание, что мы хешируем значения в B через set для оптимизации стоимости поиска.Сложность O ( m + n ), где m и n - количество элементов в A и B соответственно,Для обработки ошибок в случае, если совпадение не найдено, вы можете указать аргумент по умолчанию:

first_list = next((idx for idx, val in enumerate(A) if val in B_set), len(A))

Если вы счастливы использовать стороннюю библиотеку, вы можете использовать NumPy.Здесь нет обработки ошибок в случае несоответствия:

import numpy as np

A = np.array([53, 1, 17, 4, 13, 2, 17])
B = np.array([4, 3, 1])

first_np = np.where(np.in1d(A, B))[0][0]  # 1
0 голосов
/ 03 октября 2018

Вы можете использовать следующее выражение генератора:

next(i for i, a in enumerate(ListA) for b in ListB if a == b)

Учитывая ваш пример ввода, это возвращает: 1

0 голосов
/ 03 октября 2018

Установить пересечение, чтобы найти общие значения.Затем найдите все индексы, которые присутствуют в ListA, а затем найдите минимальный индекс.Если в случае отсутствия совпадения будет напечатана длина ListA

set_inter =set(ListB).intersection(ListA)

if set_inter: # if there is a common value
    idx_A=min([ListA.index(i) for i in set_inter])
    print(idx_A)
else:
    print(len(ListA)) # print the length of ListA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...