【问题标题】:Python - How can i create a nested map function based on the number of entries in a dictionaryPython - 如何根据字典中的条目数创建嵌套映射函数
【发布时间】: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


    【解决方案1】:

    这将为您提供所有可能的非冲突时间表。我使用递归来获得所有可能的主题组合:

    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)]
    

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 2014-06-30
      • 2015-06-10
      • 2020-05-18
      • 2020-11-05
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 2021-09-22
      相关资源
      最近更新 更多