首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -如何根据字典中的条目数创建嵌套地图函数

Python -如何根据字典中的条目数创建嵌套地图函数
EN

Stack Overflow用户
提问于 2019-07-19 05:21:20
回答 1查看 132关注 0票数 0

把…放在上下文中。我试图将主题的时间表作为函数的参数来比较,如果它们是在同一时间开发的。我得到了一个函数,它将*args的调度作为输入进行比较。数据和函数的结构是这样的:(其中每个2位数字表示‘天’+‘模块’,所以14表示星期一4模块)

代码语言:javascript
复制
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

每个输入必须来自不同的主题,所以我知道如果运行:

代码语言:javascript
复制
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个科目的具体情况所做的工作:

代码语言:javascript
复制
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解决方案被过滤为无用的。

EN

回答 1

Stack Overflow用户

发布于 2019-07-19 15:41:45

这将使您获得所有可能的无冲突计划。我使用递归来获得所有可能的主题组合:

代码语言:javascript
复制
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)

打印:

代码语言:javascript
复制
[('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)]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57102776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档