我对名为intervals
的函数有以下定义。
从底部的打印声明我得到这个结果(这是半小时的时间间隔,如9:00,9:30等,表示为列表中的列表,我相信)。
[[9,0],[10,30],[10,30],[10,30]]
我想要以下结果。
[[9,0],[9,30],[10,0],[10,30]]
运行的完整日志如下。请注意,列表list
仅在while
和print "b(efore)"
语句之间的print "a(fter)"
循环中更新一次,但在list
后更改after
在下一个before
之前。怎么会发生这种情况?
[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])
任何人都可以解决它吗?
答案 0 :(得分:1)
您看到这一点的原因是,在while
循环的每次迭代中,您将列表new
附加到列表list
的末尾(您应该重命名,因为它掩盖内置列表类型。)
只需移动new=[0,0]
行,使其成为while
循环中的第一行,这将在每次迭代时创建一个新列表,这样您的最终列表就不会有多个引用同样的清单:
...
while end>last:
new=[0,0]
...
请注意,如果您计划为此添加更多复杂性(例如,不同的时间间隔超过30分钟),我建议使用datetime module,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]]
答案 1 :(得分: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]]