У меня есть список возможностей и желаемый вход:
possibles = [20, 30, 40, 50, 60, 70, 80, 100]
desired = [20, 30, 40]
Я хочу создать списки закрытия. Пример:
# Distance of 1 (i.e. 1 element changes to a close-by)
[30, 30, 40]
[20, 40, 40]
[20, 30, 30]
[20, 30, 50]
# Distance of 2:
[40, 30, 40]
[30, 30, 50]
[30, 40, 40]
...
Моя текущая версия меняет только один элемент за раз, поэтому, как только расстояние становится больше 1, я теряю много комбинаций.
def generate_close_by(possibles, desired):
for k in range(1, 4):
for i, elt in enumerate(desired):
id = possibles.index(elt)
new = desired[:]
if id < len(possibles)-k-1:
new[i] = possibles[id+k]
yield (new)
if id > k:
new[i] = possibles[id-k]
yield (new)
# Output
[30, 30, 40]
[20, 40, 40]
[20, 30, 50]
[20, 30, 30]
[40, 30, 40]
[20, 50, 40]
[20, 30, 60]
[50, 30, 40]
[20, 60, 40]
[20, 30, 70]
Я вполне уверен, что для такой итерации уже должен существовать модуль (itertools?), Не могли бы вы указать мне функцию записи?
Спасибо.
EDIT:
Обновление попыток ...
Я пытаюсь сгенерировать список того же размера, что и желаемый элемент, в котором каждый элемент соответствует тому, насколько мне нужно переместить элемент нужного значения.
desired = [20, 30, 40]
# Distance of 1:
distance = [1, 0, 0]
distance = [0, 1, 0]
distance = [0, 0, 1]
distance = [-1, 0, 0]
distance = [0, -1, 0]
distance = [0, 0, -1]
И тогда планировалось попытаться создать новый список, и если он не может (выходит за пределы), он просто продолжается. Пока не работает, но может быть хорошим подходом.