как рассчитать все возможные комбинации с наименьшим делением между комбинациями

У меня есть 3 списка:

a = {1:10,2:12,3:14}
b = {1:5,2:4,3:8}
c = {1:6,2:7,3:3}

Теперь я могу получить все перестановки с помощью itertools

from itertools import combinations
input = ['a', 'b', 'c', 'd']
output = sum([list(map(list, combinations(input, i))) for i in range(len(input) + 1)], [])

но теперь мой вопрос: как рассчитать общее число, сложив вместе a + b + c для каждой комбинации и получив наименьшее отклонение между ними.

Он также должен следить за тем, чтобы ни один индекс не использовался более одного раза.

Так, например, мы могли бы сделать:

A1 + B3 + C2 = 10 + 8 + 7 = 25
A2 + B1 + C1 = 12 + 5 + 6 = 23
A3 + B2 + C3 = 14 + 4 + 3 = 21

Итак, мы можем видеть, что у нас есть отклонение 4 (от самого высокого до самого низкого). Я не уверен на 1005, что это лучшая комбинация, но это просто для демонстрации.

Эта программа должна иметь возможность адаптироваться для работы с большим количеством ценностей.

Список A никогда не будет больше, чем B или C, поскольку иногда они могут иметь больше, чем первый список.

спасибо, что нашли время.


person Mark    schedule 16.12.2020    source источник
comment
Во-первых, не совсем очевидно, что делает output = sum([list(map(list, combinations(input, i))) for i in range(len(input) + 1)], []); Вам, может быть, стоит это объяснить. Во-вторых, действительно непонятно, чего вы пытаетесь достичь. Вы не уверены, что A1 + B3 + C2 - лучшая комбинация для чего?   -  person Stef    schedule 17.12.2020
comment
Я также скажу, что я запутался. Из вашего описания не ясно, что вы пытаетесь вычислить.   -  person Frank Yellin    schedule 17.12.2020
comment
@Stef Моя цель - вычислить лучшую комбинацию чисел, которая является весом. Я пытаюсь вычислить все возможные комбинации, чтобы между ними было наименьшее разделение. Прошу прощения за то, что не был так ясен, поскольку я еще новичок в том, чтобы задавать вопросы здесь   -  person Mark    schedule 17.12.2020
comment
@FrankYellin посмотрите и мой комментарий   -  person Mark    schedule 17.12.2020
comment
Прежде всего, я хотел бы отметить, что, как описано, a, b, c не являются списками, это словари. Теперь вы можете объяснить, что такое «индекс» в этом вычислении? Вы можете объяснить, что вы имеете в виду под отклонением? Можете ли вы объяснить, как перестановки ['a', 'b', 'c', 'd'] относятся к трем словарям?   -  person itprorh66    schedule 17.12.2020
comment
Я до сих пор не понимаю, что вы пытаетесь сделать.   -  person Frank Yellin    schedule 17.12.2020


Ответы (1)


Ваш вопрос довольно непонятный, очень сложно понять, что вы пытаетесь сделать. Я предполагаю, что у вас есть три разных набора чисел, и вы собираетесь рассмотреть все возможные тройки, которые можно получить, выбирая по одному числу за раз из каждого набора. Затем вы хотите вычислить диапазон результатов, полученных суммированием троек.

Во-первых, мы создаем список с вашими словарями (обратите внимание, что в вашем вопросе a, b и c - это словари, а не списки):

In [22]: dicts = [a, b, c]

Размер этого списка не ограничен 3. Если у вас было больше словарей, вы можете создать более длинный список, например discts = [a, b, c, d, e, ...].

Затем мы сохраняем значения словарей в списке списков:

In [23]: data = [list(letter.values()) for letter in dicts]

In [24]: data
Out[24]: [[10, 12, 14], [5, 4, 8], [6, 7, 3]]

Теперь мы готовы сгенерировать все возможные тройки и соответствующие суммы. Для этого может пригодиться itertools.product:

In [25]: from itertools import product

In [26]: combos = {triplet: sum(triplet) for triplet in product(*data)}

In [27]: combos
Out[27]: 
{(10, 5, 6): 21,
 (10, 5, 7): 22,
 (10, 5, 3): 18,
 (10, 4, 6): 20,
 (10, 4, 7): 21,
 (10, 4, 3): 17,
 (10, 8, 6): 24,
 (10, 8, 7): 25,
 (10, 8, 3): 21,
 (12, 5, 6): 23,
 (12, 5, 7): 24,
 (12, 5, 3): 20,
 (12, 4, 6): 22,
 (12, 4, 7): 23,
 (12, 4, 3): 19,
 (12, 8, 6): 26,
 (12, 8, 7): 27,
 (12, 8, 3): 23,
 (14, 5, 6): 25,
 (14, 5, 7): 26,
 (14, 5, 3): 22,
 (14, 4, 6): 24,
 (14, 4, 7): 25,
 (14, 4, 3): 21,
 (14, 8, 6): 28,
 (14, 8, 7): 29,
 (14, 8, 3): 25}

Наконец, диапазон результатов можно рассчитать следующим образом:

In [28]: max(combos.values()) - min(combos.values())
Out[28]: 12

Боковое примечание: input - встроенная функция в Python. Не используйте input для обозначения функции или переменной!

person Tonechas    schedule 17.12.2020