Всякий раз, когда вы думаете, " n самое большое ", думайте heapq
.
>>> import heapq
>>> import random
>>> l1 = [random.randrange(100) for _ in range(100)]
>>> l2 = [random.randrange(100) for _ in range(100)]
>>> heapq.nlargest(10, (((a - b), a, b) for a, b in zip(l1, l2)))
[(78, 99, 21), (75, 86, 11), (69, 90, 21), (69, 70, 1), (60, 86, 26), (55, 95, 40), (52, 56, 4), (48, 98, 50), (46, 80, 34), (44, 81, 37)]
Это найдет x самых больших элементов за O (n log x), где n - общее количество элементов в списке;сортировка делает это за O (n log n).
Мне просто пришло в голову, что вышеприведенное на самом деле не делает то, что вы просили.Вы хотите индекс!Все еще очень легко.Я также буду использовать abs
здесь на случай, если вы захотите абсолютное значение разницы:
>>> heapq.nlargest(10, xrange(len(l1)), key=lambda i: abs(l1[i] - l2[i]))
[91, 3, 14, 27, 46, 67, 59, 39, 65, 36]