Индекс поиска с python без цикла - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть список в python, например, A = [-22, -10,0,3,8], и я хочу найти A [x] = x, это означает, что индекс и число в список имеет одинаковое значение. В этом случае x = 3, потому что A [3] = 3.

Могу ли я найти x без al oop?

РЕДАКТИРОВАТЬ: Это проблема Academi c, и у меня есть подсказка «Вам не нужно посещать каждую позицию в массиве», и номера будут упорядочены и уникальны

Ответы [ 5 ]

2 голосов
/ 14 февраля 2020

Учитывая, что элементы списка являются целыми, по порядку и по-разному, проблему можно решить с помощью двоичного поиска . Это потому, что последовательность a[i] - i неубывающая. Бинарный поиск не посещает «каждую» позицию в массиве; только O (log n) из них.

1 голос
/ 14 февраля 2020

вы можете использовать понимание списка (но на самом деле это просто скрытие l oop):

это даст вам все индексы, где A [i] == i:

indexes = [i for i,a in enumerate(A) if i==a]  # [1, 2, 3]

если вам нужен только первый, вы можете использовать следующую функцию:

index = next((i for i,a in enumerate(A) if i==a),None) # 1
0 голосов
/ 14 февраля 2020

Только для lulz, рекурсивная функция:

def find(l, i):
  if i>=len(l):
    return None
  elif l[i]==i:
    return i
  else:
    return find(l, i+1)

# for searching in the whole list the second argument needs to be 0
print(find([-22,-10,0,3,8], 0))
0 голосов
/ 14 февраля 2020

Использование index?

>>> [-22,-10,0,3,8].index(3)
3
0 голосов
/ 14 февраля 2020

Получается Python, чтобы выполнить цикл для вас:

list(map(lambda x: x[0], filter(lambda x: x[0] == x[1], enumerate([-2,1,2,3,8]))))
# [1, 2, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...