把…放在上下文中。我试图将主题的时间表作为函数的参数来比较,如果它们是在同一时间开发的。我得到了一个函数,它将*args的调度作为输入进行比较。数据和函数的结构是这样的:(其中每个2位数字表示‘天’+‘模块’,所以14表示星期一4模块)
data = {'MAT': {1:[21,56,45], #maths 1st sec, 3 times a week:tuesday, friday and thursday)
2:[23,45,66],
3:[23,45,65],
4:[54,38,37],
5:[23,45,65]},
'IND': {1:[37,51,44],
2:[13,14,25],
3:[78,45,54],
4:[94,45,37]},
'ECO': {1:[12,56,42],
2:[23,54,66],
3:[69,45,65],
4:[16,28,35]},
'REL': {1:[21,56,33],
2:[68,69,76],
3:[24,69,87],
4:[54,48,37]}}
def set_if2(*args):
lista = sum(args, [])
if len(set(lista)) == len(lista):
return lista每个输入必须来自不同的主题,所以我知道如果运行:
TEST = set_if2(X['MAT'][1], X['IND'][1], X['ECO'][2], X['REL'][2])我的输出将是TEST = [21, 56, 45, 37, 51, 44, 23, 54, 66, 68, 69, 76]
也就是说,如果我上了这四门课,我就得在这四个小时里上大学。但是,只有在类之间没有时间重合的情况下,才有可能得到结果。
我的问题是,我如何才能实现比较每种可能的组合,每次只选择每个主题的一个部分。我知道我可以通过使用for循环来做到这一点,但我正在寻找最有效的方法,因为原始数据集比示例中的数据集要大得多。因此,我尝试使用map函数,但是,这不起作用,因为嵌套的map函数的数量取决于我想要获取的主题数量。
以下是我尝试针对4个科目的具体情况所做的工作:
def mix_unmatched(Ramo1, Ramo2, Ramo3, Ramo4):
p = list(map(lambda x: list(map(lambda y: list(map(lambda z: list(map(lambda k: set_if2(Ramo1[x], Ramo2[y], Ramo3[z], Ramo4[k]),Ramo4)), Ramo3)), Ramo2)), Ramo1))
return p
MIX = mix_unmatched(X['MAT'], X['IND'], X['ECO'], X['REL'])我认为我的解决方案必须类似于使用递归自动创建嵌套映射的函数。但我不知道这是否可能,所以如果你带着其他东西来,欢迎你。
我还没有考虑输出,但我相信数据帧或字典就可以完成这项工作,就像{...'MAT-1, IND-3, ECO-1, REL-2' = [21, 56, 45, 37, 51, 44, 23, 54, 66, 68, 69, 76], ...}一样。在那里None解决方案被过滤为无用的。
发布于 2019-07-19 15:41:45
这将使您获得所有可能的无冲突计划。我使用递归来获得所有可能的主题组合:
data = {'MAT': {1:[21,56,45], #maths 1st sec, 3 times a week:tuesday, friday and thursday)
2:[23,45,66],
3:[23,45,65],
4:[54,38,37],
5:[23,45,65]},
'IND': {1:[37,51,44],
2:[13,14,25],
3:[78,45,54],
4:[94,45,37]},
'ECO': {1:[12,56,42],
2:[23,54,66],
3:[69,45,65],
4:[16,28,35]},
'REL': {1:[21,56,33],
2:[68,69,76],
3:[24,69,87],
4:[54,48,37]}}
out = []
for k, v in data.items():
out.append([])
for kk in v:
out[-1].append((k, kk))
def get_schedules(all_data, current_data=[]):
if len(current_data) == len(data):
yield current_data
for idx, d in enumerate(all_data):
for i in d:
yield from get_schedules(all_data[idx+1:], current_data + [i])
def is_schedule_possible(data, schedule):
all_hours = []
for (subject, idx) in schedule:
all_hours.extend(data[subject][idx])
return(len(all_hours) == len(set(all_hours)))
for s in get_schedules(out):
if (is_schedule_possible(data, s)):
print(s)打印:
[('MAT', 1), ('IND', 1), ('ECO', 2), ('REL', 2)]
[('MAT', 1), ('IND', 1), ('ECO', 2), ('REL', 3)]
[('MAT', 1), ('IND', 1), ('ECO', 4), ('REL', 2)]
[('MAT', 1), ('IND', 1), ('ECO', 4), ('REL', 3)]
[('MAT', 1), ('IND', 2), ('ECO', 2), ('REL', 2)]
[('MAT', 1), ('IND', 2), ('ECO', 2), ('REL', 3)]
[('MAT', 1), ('IND', 2), ('ECO', 4), ('REL', 2)]
[('MAT', 1), ('IND', 2), ('ECO', 4), ('REL', 3)]
[('MAT', 1), ('IND', 2), ('ECO', 4), ('REL', 4)]
[('MAT', 2), ('IND', 1), ('ECO', 1), ('REL', 2)]
[('MAT', 2), ('IND', 1), ('ECO', 1), ('REL', 3)]
[('MAT', 2), ('IND', 1), ('ECO', 4), ('REL', 1)]
[('MAT', 2), ('IND', 1), ('ECO', 4), ('REL', 2)]
[('MAT', 2), ('IND', 1), ('ECO', 4), ('REL', 3)]
[('MAT', 2), ('IND', 2), ('ECO', 1), ('REL', 2)]
[('MAT', 2), ('IND', 2), ('ECO', 1), ('REL', 3)]
[('MAT', 2), ('IND', 2), ('ECO', 1), ('REL', 4)]
[('MAT', 2), ('IND', 2), ('ECO', 4), ('REL', 1)]
[('MAT', 2), ('IND', 2), ('ECO', 4), ('REL', 2)]
[('MAT', 2), ('IND', 2), ('ECO', 4), ('REL', 3)]
[('MAT', 2), ('IND', 2), ('ECO', 4), ('REL', 4)]
[('MAT', 3), ('IND', 1), ('ECO', 1), ('REL', 2)]
[('MAT', 3), ('IND', 1), ('ECO', 1), ('REL', 3)]
[('MAT', 3), ('IND', 1), ('ECO', 4), ('REL', 1)]
[('MAT', 3), ('IND', 1), ('ECO', 4), ('REL', 2)]
[('MAT', 3), ('IND', 1), ('ECO', 4), ('REL', 3)]
[('MAT', 3), ('IND', 2), ('ECO', 1), ('REL', 2)]
[('MAT', 3), ('IND', 2), ('ECO', 1), ('REL', 3)]
[('MAT', 3), ('IND', 2), ('ECO', 1), ('REL', 4)]
[('MAT', 3), ('IND', 2), ('ECO', 4), ('REL', 1)]
[('MAT', 3), ('IND', 2), ('ECO', 4), ('REL', 2)]
[('MAT', 3), ('IND', 2), ('ECO', 4), ('REL', 3)]
[('MAT', 3), ('IND', 2), ('ECO', 4), ('REL', 4)]
[('MAT', 4), ('IND', 2), ('ECO', 1), ('REL', 2)]
[('MAT', 4), ('IND', 2), ('ECO', 1), ('REL', 3)]
[('MAT', 4), ('IND', 2), ('ECO', 3), ('REL', 1)]
[('MAT', 4), ('IND', 2), ('ECO', 4), ('REL', 1)]
[('MAT', 4), ('IND', 2), ('ECO', 4), ('REL', 2)]
[('MAT', 4), ('IND', 2), ('ECO', 4), ('REL', 3)]
[('MAT', 5), ('IND', 1), ('ECO', 1), ('REL', 2)]
[('MAT', 5), ('IND', 1), ('ECO', 1), ('REL', 3)]
[('MAT', 5), ('IND', 1), ('ECO', 4), ('REL', 1)]
[('MAT', 5), ('IND', 1), ('ECO', 4), ('REL', 2)]
[('MAT', 5), ('IND', 1), ('ECO', 4), ('REL', 3)]
[('MAT', 5), ('IND', 2), ('ECO', 1), ('REL', 2)]
[('MAT', 5), ('IND', 2), ('ECO', 1), ('REL', 3)]
[('MAT', 5), ('IND', 2), ('ECO', 1), ('REL', 4)]
[('MAT', 5), ('IND', 2), ('ECO', 4), ('REL', 1)]
[('MAT', 5), ('IND', 2), ('ECO', 4), ('REL', 2)]
[('MAT', 5), ('IND', 2), ('ECO', 4), ('REL', 3)]
[('MAT', 5), ('IND', 2), ('ECO', 4), ('REL', 4)]https://stackoverflow.com/questions/57102776
复制相似问题