【发布时间】:2019-07-18 21:21:19
【问题描述】:
放在上下文中。我试图将主题时间表作为函数的参数,以比较它们是否在同一时间开发。我有一个比较 *args 的时间表作为输入的函数。数据的结构和函数是这样的:(其中每2位数字表示'day'+'module',所以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]
这意味着如果我参加了这 4 节课,我将不得不在那几个小时内上大学。但只有在类之间没有时间重合的情况下才有可能得出结果。
我的问题是,我如何才能比较每个可能的组合,每次只选择一个部分。我知道我可以通过使用 for 循环来做到这一点,但我正在寻找最有效的方法,因为原始数据集比示例中的数据集大得多。所以,我尝试使用地图函数,但是,这不起作用,因为嵌套地图函数的数量取决于我想参加多少科目。
对于采取 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 解决方案因无用而被过滤。
【问题讨论】:
标签: python-3.x dictionary nested map-function