首先搜索所有可能的排列,然后取最大值作为值的总和,最后打印出来。这是我的数据框实现:
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 个组,因此我们需要 4 个可用教师中的 3 个(教师 A、B、C 和 D)。例如排列('Teacher A', 'Teacher B', 'Teacher C') 表示Group1=Teacher A, Group2=Teacher B, Group3=Teacher C)。
所以我们将用permuts = itertools.permutations(cols, len(rows))枚举3位老师的所有有序排列:
('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')
所以在我们的变量permuts中得到24个元组
然后我们计算每个排列的值的总和,我们得到一个包含这些元素的大列表:
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)表示此特定排列的值的总和。
然后我们选择和最大的排列,这里是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