Вы можете перебирать подсписки более длинного списка и передавать ключевую функцию в min
:
lst = [ 669, 592, 664, 1005, 699, 401, 646, 472, 598, 681, 1126 ]
small = [ 400, 650, 475 ]
match = min((lst[i:i + len(small)] for i in range(len(lst) - len(small) + 1)), key=lambda sub: sum(abs(a - b) for a, b in zip(small, sub)))
print(match) # 401, 646, 472
И если вы хотите, чтобы отсортированный список наилучшего совпадения совпадал с худшим, просто замените min
с sorted
.
print(sorted((lst[i:i + len(small)] for i in range(len(lst) - len(small) + 1)), key=lambda sub: sum(abs(a - b) for a, b in zip(small, sub))))
[[401, 646, 472], [472, 598, 681], [669, 592, 664], [646, 472, 598], [699, 401, 646], [1005, 699, 401], [592, 664, 1005], [664, 1005, 699], [598, 681, 1126]]
Если вы находите страшными однострочники (я должен признать, что да, ха-ха), вот немного более читаемая версия:
lst = [ 669, 592, 664, 1005, 699, 401, 646, 472, 598, 681, 1126 ]
small = [ 400, 650, 475 ]
def key(sublist):
result = 0
for a, b in zip(sublist, small):
result += abs(a - b)
return result
sublist_iter = (lst[i:i + len(small)] for i in range(len(lst) - len(small) + 1))
match = min(sublist_iter, key=key) # or `sorted`
print(match)