【发布时间】:2022-01-20 03:54:08
【问题描述】:
我有一个列表列表,其中每个单独的列表代表哪些人可以参加工作计划轮班。我的实际数据是 50 个班次的列表:
[['P3', 'P2', 'P4', 'P5'], ['P1', 'P3', 'P2', 'P4'], ['P1', 'P3', ' P2','P4'],['P1'],['P5'],['P1','P3','P5','P2','P4'],['P1','P3' , 'P5', 'P2', 'P4'], ['P3', 'P2', 'P4', 'P5'], ['P3', 'P2', 'P4', 'P5'], ['P2', 'P5'], ['P1', 'P2', 'P5'], ['P1', 'P2', 'P5'], ['P1', 'P3', 'P5' , 'P2', 'P4'], ['P5'], ['P2'], ['P1', 'P3', 'P4', 'P5'], ['P1', 'P3', ' P4','P5'],['P1','P3','P4','P5'],['P1','P3','P5','P2','P4'],[' P1','P3','P5','P2','P4'],['P1','P3','P5','P2','P4'],['P1','P3' , 'P2', 'P4'], ['P1', 'P3', 'P2', 'P4'], ['P1', 'P3', 'P2', 'P4'], ['P1' , 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', ' P5','P2','P4'],['P1','P3','P5','P2','P4'],['P1','P3','P5','P2' , 'P4'], ['P1', 'P3', 'P4'], ['P1', 'P3', 'P2', 'P4'], ['P1', 'P2', 'P4' ],['P1','P2','P4','P5'],['P1','P2','P5'],['P1','P3','P2','P5' ],['P1','P3','P2','P5'],['P1','P3','P5','P2','P4'],['P1','P3' , 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P2'], ['P4'], ['P1' ', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P5', 'P2' ', 'P4'], ['P1', 'P3', 'P5', 'P2', 'P4'], ['P1', 'P3', 'P2', 'P4'], ['P1 ', 'P3', 'P2', 'P4']]
我试图以 50 个最终列表结束(即 ['P3', 'P2', 'P4', 'P1', 'P5', 'P2', ...]两个标准:
选项 A:重复元素最大程度地分散
选项 B:每个重复元素至少间隔 2 个索引空间,即 ['P1', 'P1'] 或 ['P1', 'P2', 'P1] 是不可接受的,但 [ 'P1, 'P2', 'P3', 'P1'] 没问题。
我不知道如何处理选项 A tbh。对于选项 B,这是我目前所拥有的:
AssignList = []
for ix, x in enumerate(AvailableList):
randx = random.choice(x)
if len(AssignList)==1:
while randx==AssignList[0]:
randx=random.choice(x)
if len(AssignList)>1:
while (randx==AssignList[-1]) | (randx==AssignList[-2]):
randx=random.choice(x)
AssignList.append(randx)
print(AssignList)
但是我的方法的问题是我认为它到达了一些列表,其中有一个选择会导致无限循环。非常感谢任何一种方法的提示!
【问题讨论】:
-
您是否希望您的最终列表是包含 50 个元素的单个列表,您能否举一个输入较少且预期完整输出的简单示例以说明清楚,您可以根据这两个你有的选择,
-
是的,相信我在上面确实提到了预期结果是一个包含 50 个元素的列表,我说作为示例,输出将是:['P3', 'P2', 'P4', ' P1','P5','P2',...]。关于两个选项的不同输出,我认为选项 A 有点难以展示,但以上将满足选项 B 对前 6 个元素的要求。
-
此列表中的所有子列表中有超过 50 个元素。可以将这个列表展平并从那个大池中选择 50 个吗?
-
不,抱歉应该更好地澄清这一点。目标是从每个子列表中选择 1 个元素,总共 n 个元素,其中 n 是较大列表的长度(在这种情况下,我认为是 50 或 51)。每个子列表代表可以轮班工作的人员(P1、P2 等),因此目标是将每个子列表中的 1 分配给轮班。