Python:从字典列表中的值生成特定组合以进行时间表计划

时间:2018-08-23 03:50:41

标签: python iterator combinations itertools

我正在尝试构建一个Python程序,该程序可以帮助我安排时间表,从而使我有最多的大学放假时间(最少上学日)。

用户应输入一些课程(课程A,课程B,课程C),他们将收到建议的组合列表,这些组合将为他们提供最少的上课时间而无时间冲突(例如,课程A(L1,T1)课程B(L3,T3B)课程C(L2,T2C))

我从大学网站上刮了一些有关课程的信息,现在我被困住了。这是我刮掉的内容的一个示例。

{'Lectures':{'L1 (2196)': 'Mo04:30PM-05:50PM Fr12:00PM-01:20PM'}, 'Tutorial': {'T1 (2198)': 'Th06:00PM-06:50PM', 'T2 (2200)': 'Mo03:00PM-03:50PM'}, 'Lab': {}}
{'Lectures': {'L1 (2201)': 'Tu09:00AM-10:20AM Th09:00AM-10:20AM', 'L2 (2203)': 'Tu12:00PM-01:20PM Th12:00PM-01:20PM', 'L3 (2205)': 'Tu03:00PM-04:20PM Th03:00PM-04:20PM', 'L4 (2207)': 'Tu01:30PM-02:50PM Th01:30PM-02:50PM', 'L5 (2209)': 'Tu10:30AM-11:50AM Th10:30AM-11:50AM', 'L6 (2211)': 'Tu04:30PM-05:50PM Th04:30PM-05:50PM'}, 'Tutorial': {'T1A (2213)': 'Mo05:30PM-06:20PM', 'T1B (2215)': 'We06:00PM-06:50PM', 'T2A (2216)': 'Fr12:00PM-12:50PM', 'T2B (2217)': 'Fr01:30PM-02:20PM', 'T3A (2218)': 'We04:30PM-05:20PM', 'T3B (2219)': 'Th12:00PM-12:50PM', 'T4A (2220)': 'Fr03:30PM-04:20PM', 'T4B (2221)': 'Mo02:00PM-02:50PM', 'T5A (2222)': 'Fr12:00PM-12:50PM', 'T5B (2223)': 'Mo06:00PM-06:50PM', 'T6A (2224)': 'We06:00PM-06:50PM', 'T6B (2225)': 'Mo02:00PM-02:50PM'}, 'Lab': {}}

最外面的字典是课程,里面是三个字典,分别命名为“讲座”,“教程”,“实验室”,并非所有课程都具有这三个主题,但是您必须将其安排在时间表中或更多会话存在。我想创建这些课程的组合,然后检查是否发生时间冲突,如果是,则将这些组合丢弃。但是,我不确定如何创建这样的组合来确保这一点。

编辑

我的最终目标是获得这样的列表:

course A={'L':{'L1':'Time','L2':'Time'},'T':{'T1':'Time','T2':'Time'},'LAB':{'LAB1':'Time}}
course B={'L':{'L1':'Time'},'T':{'T1':'Time','T2':'Time'},'LAB':{'LAB1':'Time}}

我想要类似

的组合
CourseA(L1,T1,LAB1)CourseB(L1,T1)
CourseA(L1,T2,LAB1)CourseB(L1,T1)
CourseA(L2,T1,LAB1)CourseB(L1,T1)
CourseA(L1,T1,LAB1)CourseB(L1,T2)
CourseA(L1,T2,LAB1)CourseB(L1,T2)
CourseA(L2,T1,LAB1)CourseB(L1,T2)

,那么也许我将通过追溯到会话的值(时间)来进一步过滤掉那些有时间冲突的对象。

1 个答案:

答案 0 :(得分:0)

为这样的嵌套列表生成排列有点棘手。

仅从这里开始,这就是如何为某些嵌套列表生成所有可能的排列。您需要尝试弄清楚如何将这种模式应用于问题。

import itertools
# a list with 4 categories
a = [[1,2,3],[4,5,6],[7,8,9], [10,11,12]]

# this function will help generate permutations
prod = itertools.product

# combine the first two columns. The for loop below assumes
# that the previous result is a list.
result = list(prod(a[0],a[1]))

for x in a[2:]:
    result = list(prod(x, result))
    result = [[r[0]] + list(r[1]) for r in result]

print(result)

该程序的输出为:

[[10, 7, 1, 4], [10, 7, 1, 5], [10, 7, 1, 6], [10, 7, 2, 4], [10, 7, 2, 5], 
[10, 7, 2, 6], [10, 7, 3, 4], [10, 7, 3, 5], [10, 7, 3, 6], [10, 8, 1, 4], ... 
[12, 9, 1, 5], [12, 9, 1, 6], [12, 9, 2, 4], [12, 9, 2, 5], [12, 9, 2, 6], 
[12, 9, 3, 4], [12, 9, 3, 5], [12, 9, 3, 6]]

现在,您希望生成代表每个类的排列,然后对这些列表执行相同的操作。