Сначала найдите все возможные перестановки, затем возьмите максимум для суммы значений и, наконец, напечатайте его. Вот моя реализация с фреймами данных:
import itertools
m = [
[50, 40, 20, 50],
[30, 10, 40, 100],
[80, 60, 40, 20]
]
rows = ['Group 1', 'Group 2', 'Group 3']
cols = ['Teacher A', 'Teacher B', 'Teacher C', 'Teacher D']
df = pd.DataFrame(m, index=rows, columns=cols)
permuts = itertools.permutations(cols, len(rows))
L = []
for p in permuts:
s = 0
d = {}
for i, r in enumerate(rows):
s += df[p[i]][r]
d[r] = p[i]
obj = [s, d]
L.append(obj)
result = max(L, key=lambda x: x[0])
# [220, {'Group 1': 'Teacher B', 'Group 2': 'Teacher D', 'Group 3': 'Teacher A'}]
# Here 220 is the maximum sum you can have
result_dict = result[1]
# {'Group 1': 'Teacher B', 'Group 2': 'Teacher D', 'Group 3': 'Teacher A'}
for i, v in result_dict.items():
print("{} with {} : {}".format(i, v, df[v][i]))
# Group 1 with Teacher B : 40
# Group 2 with Teacher D : 100
# Group 3 with Teacher A : 80
Пояснения
Вот небольшой пример работы itertools.permutations
. Число 2
- это длина каждой перестановки, а ['a','b','c']
- элементы перестановки:
import itertools
permuts = itertools.permutations(['a','b','c'],2)
for i in a:
print(i)
Вывод: (6 перестановок здесь)
('a', 'b')
('a', 'c')
('b', 'a')
('b', 'c')
('c', 'a')
('c', 'b')
В нашем В этом случае у нас есть 3 группы, поэтому нам нужно 3 учителя из 4 доступных (учителя A, B, C и D). Например, перестановка ('Teacher A', 'Teacher B', 'Teacher C')
означает Group1=Teacher A, Group2=Teacher B, Group3=Teacher C)
.
Итак, мы перечислим все упорядоченные перестановки 3 учителей с помощью permuts = itertools.permutations(cols, len(rows))
:
('Teacher A', 'Teacher B', 'Teacher C')
('Teacher A', 'Teacher B', 'Teacher D')
('Teacher A', 'Teacher C', 'Teacher B')
...
('Teacher D', 'Teacher C', 'Teacher A')
('Teacher D', 'Teacher C', 'Teacher B')
Так что получим 24 кортежа в нашей переменной permuts
Затем мы вычисляем сумму значений для каждой перестановки и получаем большой список, содержащий следующие элементы:
L = []
for p in permuts:
s = 0
d = {}
for i, r in enumerate(rows):
s += df[p[i]][r]
d[r] = p[i]
obj = [s, d]
L.append(obj)
Выходные данные L:
[
[100, {'Group 1': 'Teacher A', 'Group 2': 'Teacher B', 'Group 3': 'Teacher C'}]
[80, {'Group 1': 'Teacher A', 'Group 2': 'Teacher B', 'Group 3': 'Teacher D'}]
...
[220, {'Group 1': 'Teacher B', 'Group 2': 'Teacher D', 'Group 3': 'Teacher A'}]
]
...
первое число (например, 100, 80 и 220) представляет сумму значений для этой перестановки c.
Затем мы выбираем перестановку с максимальной суммой, здесь 220
result = max(L, key=lambda x: x[0])
# [220, {'Group 1': 'Teacher B', 'Group 2': 'Teacher D', 'Group 3': 'Teacher A'}]
И, наконец, мы печатаем перестановку со значениями из кадра данных с print("{} with {} : {}".format(i, v, df[v][i]))
. Например df["Teacher B"]["Group 1"] = 40
:
Group 1 with Teacher B : 40
Group 2 with Teacher D : 100
Group 3 with Teacher A : 80