0

我对名为intervals. 从底部的打印语句中我得到了这个结果(我相信这是半小时的时间间隔,如 9:00、9:30 等,以列表中的列表表示)。

[[9, 0], [10, 30], [10, 30], [10, 30]]

我想要以下结果。

[[9, 0], [ 9, 30], [10, 0], [10, 30]]

完整的运行日志如下。请注意,列表list仅在and语句while之间的循环中更新一次,但在 next之后和之前发生变化。怎么会这样?print "b(efore)"print "a(fter)"listafterbefore

[9, 30] [[9, 0]] b
[9, 30] [[9, 0], [9, 30]] a
[10, 0] [[9, 0], [10, 0]] b
[10, 0] [[9, 0], [10, 0], [10, 0]] a
[10, 30] [[9, 0], [10, 30], [10, 30]] b
[10, 30] [[9, 0], [10, 30], [10, 30], [10, 30]] a
[[9, 0], [10, 30], [10, 30], [10, 30]]

def intervals(start,end):
    if start>=end:
        return []
    else:
        if 0<=start[1]<30:
            start[1]=0
        else:
            start[1]=30
        list = []
        list.append(start)
        last = start
        new=[0,0]
        while end>last:
            if 30==last[1]:
                new[0]=1+last[0]
                new[1]=0
            else:
                new[0]=last[0]
                new[1]=30
            last=new
            print new,list,"b"
            list.append(new)
            print new,list,"a"
        return list

print intervals([9,0],[10,30])

任何人都可以修复它吗?

4

2 回答 2

1

您看到这一点的原因是,在循环的每次迭代中,while您将列表附加到列表new的末尾list(您应该真正重命名,因为它掩盖了内置列表类型)。

只需移动该new=[0,0]行,使其成为while循环中的第一行,这将在每次迭代时创建一个新列表,这样您的最终列表就不会多次引用同一个列表:

        ...
        while end>last:
            new=[0,0]
            ...

请注意,如果您打算为此添加更多复杂性(例如,与 30 分钟不同的时间间隔),我真的建议使用datetime 模块datetime.timedelta(minutes=30)这可能会很有用,例如:

from datetime import datetime, timedelta

def intervals(start, end):
    temp = datetime.min + timedelta(hours=start[0], minutes=start[1])
    last = datetime.min + timedelta(hours=end[0], minutes=end[1])
    interval = timedelta(minutes=30)
    result = []
    while temp <= last:
        result.append([temp.hour, temp.minute])
        temp += interval
    return result

>>> intervals([9, 30], [12, 30])
[[9, 30], [10, 0], [10, 30], [11, 0], [11, 30], [12, 0], [12, 30]]
>>> intervals([9, 45], [12, 15])
[[9, 45], [10, 15], [10, 45], [11, 15], [11, 45], [12, 15]]
于 2012-08-27T19:05:06.833 回答
0

使用while-else循环:

start_hour=9
start_min=30
lis=[[start_hour,start_min]] #simple initialize
stop_hour=12
stop_min=30

while lis[-1][0]!=stop_hour:
    if lis[-1][1]==30:
        lis.append([lis[-1][0]+1,0])
    else:
        lis.append([lis[-1][0],30])
else:
    if lis[-1][1]!=stop_min:
        lis.append([lis[-1][0],stop_min])


print lis        

输出:

[[9, 30], [10, 0], [10, 30], [11, 0], [11, 30], [12, 0], [12, 30]]
于 2012-08-27T19:07:30.777 回答