我有一个嵌套列表,我需要在其中比较值

时间:2010-10-19 20:30:43

标签: python iteration

我有一个由代表军事时间块的元组组成的列表列表:

[[(1405, 1525)],[(1405,1455),(1605,1655)],[(1505,1555),(1405,1455),(1305,1355)]]

我有一个比较两个元组的时间的函数:

def doesOverlap(tuple1, tuple2):
    #tuples each represent times for courses
    #the 0 index for each tuple is a start time
    #the 1 index is an end time
    A=int(tuple1[0])
    B=int(tuple1[1])
    C=int(tuple2[0])
    D=int(tuple2[1])

    if A<B and B<=C and C<=D:
        print(False, (A,B), (B,C))
    elif C<D and D<=A and A<B:
        print(False, (A,B), (B,C))
    else:
        print(True, (A,B), (B,C))

我需要比较嵌套列表中的时间,以便第一个列表中的第一个元组使用doOverlap与第二个元组的第一个元组进行比较。如果函数返回True,则应将第一个列表的第一个元组与第二个列表的第二个元组进行比较,依此类推。如果函数返回False,我需要将第三个列表中的第一个元组与返回False的元组进行比较。

我无法确定如何按顺序调用该函数。有什么建议吗?

编辑: 这是确切的作业问题:

此方法是您要编写的两种贪婪调度算法中的第一种。使用此特定算法,您将查看类列表并按顺序从具有最少可能会议时间的类到具有最多可能会议时间的类的顺序进行安排。当您找到列出会议次数最少的课程(您尚未安排)时,请从该课程的时间列表的开头开始,然后按顺序检查每个值,直到找到与课程不冲突的课程为止。你已经安排好了。找到这个时间后,将其添加到日程表中,然后转到下一个最短会议次数的课程。继续此过程,直到您尝试为每个课程添加时间。 完成后,返回包含计划的结果列表。 请注意,在运行此方法的过程中,不应修改包含所有课程和会议时间的词典。

我需要从单独的函数调用doOverlap,该函数是上述函数。

3 个答案:

答案 0 :(得分:1)

尝试了解问题并尝试一些事情。

仅在连续数据点与时间重叠时打印。 我还添加了assert以确保end始终大于start,否则数据是错误的。 让它变得冗长以便很好地说明它。

dataPoints = [[(1405, 1525)],[(1405,1455),(1605,1655)],[(1505,1555),(1405,1455),(1305,1355)]]
# dataPoints[0] # First list
# dataPoints[1] # Second list

def doesOverlap(input_time, compare_list):
    for time_el in input_time:
        start, end = time_el[0], time_el[1]
        # assert that end is greater than start
        assert end > start
        for compare_time_data in compare_list:
            # assert that end is greater than start
            start_to_compare, end_to_compare = compare_time_data[0], compare_time_data[1] 
            assert end_to_compare > start_to_compare
            # After sanitation compare for overlap
            # Logic: Overlap can only occur if start time less than the end time if we are not woried about AM, PM and Dates
            if start_to_compare < end:
                print 'True',  time_el, compare_time_data
            else:
                print 'False',  time_el, compare_time_data


doesOverlap(dataPoints[0], dataPoints[1])

输出:

True (1405, 1525) (1405, 1455)
False (1405, 1525) (1605, 1655)

答案 1 :(得分:0)

我认为你的问题可能过于具体;如果你提供有关问题的更多细节,我们可能会找到一个更好的解决方案,避免这种稍微狡猾的迭代。

那就是说,我不认为你说的问题是有道理的。如果我理解正确,您有三个列表(L1L2L3说)。您只对L1的第一个元组感兴趣,因此请调用initial。然后,您要将initialL2的每个元组进行比较,记录哪些元素返回False。最后,您想要将L3的第一个元组与记录的元组进行比较吗?

我认为这可能不是你的意思,因为你没有非常明确地陈述迭代协议。不过,实际上它是偶然的机会,这里有一些代码。

([initial, *_], L2, [final, *_]) = [<redacted>]
[doesOverlap(final, b) for b in (a for a in L2 if not doesOverlap(initial, a))]

修改

好吧,我真的不想为你做功课,但这里首先是我的主要建议:在开始实施之前用英语编写算法。你陷入了麻烦的细节,你不必担心。

对,代码。首先,您需要按会议次数对类列表进行排序。然后;

  

对于班级列表中的每个班级:

     
    

对于课程的每个可能时间可以是:

         
      

如果时间重叠:

             
        

略过它。

      
             

如果没有,请将其添加到计划中,并跳过剩余的时间。

    
  

答案 2 :(得分:0)

我不明白你的比较,所以我制作了检查时间顺序的代码,并且在确定时间顺序后,通过比较第一个到第二个开始时间的结束时间来查看时间段是否重叠。在这种情况下,我的函数返回True,值(而不是仅仅打印出)组合的句点和重叠时间段,在另一种情况下,我的函数返回False,并且首先按照更正的顺序和开始时间返回时间。我不知道这是否是你想做的事情。但这是我的逻辑,你可以像我一样编码。以下是我的程序输出示例:

鉴于开始:(1300,1345)鉴于结束:(1525,1345)

单独期间(1300,1345)和(1345,1525)


鉴于开始:(1405,1455)鉴于结束:(1545,1454)

合并期间(1405,1545),重叠期间(1454,1455)


鉴于开始:(1305,1405)鉴于结束:(1403,1455)

合并期间(1305,1455),重叠(1403,1405)

鉴于开始:(1305,1455)鉴于结束:(1505,1555)

单独的期间(1305,1455)和(1505,1555)