我已经对datetime.time的列表进行了排序,并希望创建类似的间隔。如果我有
a = [datetime.time(0,0), datetime.time(8,0), datetime.time(13,0), datetime.time(17,0)]
结果应该是这样的:
c = [[datetime.time(0,0),datetime.time(8,0)], [datetime.time(8,0),datetime.time(13,0)],
[datetime.time(13,0),datetime.time(17,0)], [datetime.time(17,0),datetime.time(0,0)]]
这可以通过简单的循环来实现,但是如果存在更好的解决方案呢?
使用循环:
>>> a=[datetime.time(0, 0), datetime.time(3, 0), datetime.time(8, 0), datetime.time(11, 0)]
>>>
>>> r = []
>>>
>>> for i in range(0,len(a)):
... if i+1 < len(a):
... r.append([a[i],a[i+1]])
... else:
... r.append([a[i],a[0]])
...
>>> r
[[datetime.time(0, 0), datetime.time(3, 0)], [datetime.time(3, 0), datetime.time(8, 0)], [datetime.time(8, 0), datetime.time(11, 0)], [datetime.time(11, 0), datetime.time(0, 0)]]
>>>
如果我希望结果是
[[datetime.time(0, 0), datetime.time(2, 59, 59)], [datetime.time(3, 0), datetime.time(7, 59, 59)], [datetime.time(8, 0), datetime.time(10, 59, 59)], [datetime.time(11, 0), datetime.time(23, 59, 59)]]
还有一个选项1作为一行:但是使用非常不通俗的表达式(imho),这样就不必在单独的步骤中附加最后一对和第一对:
1
zip
方法inspired by Pierre-GM's solution above。仅供参考,我更喜欢my initial answer或皮埃尔的而不是这个。
编辑/更新问题的第二部分:在一个表达式中也执行时间增量(但我看不出为什么不应该将其拆分成不同的语句…)
为了创建这样的范围,我可以尝试使用生成器:
您可以使用关键字参数来告诉
make_ranges
是否是周期性的,如果是周期性的,是否在开头或结尾包含环绕。然后您可以设置您的范围:
你可以试试
给你一个元组列表。如果你想要一个列表,只要
(编辑版本为1。列表之外的
[a[-1],a[0]]
理解和2。zip在Python3+中不返回列表的事实)另一种可能是将第一个值附加到列表中:
可以说,它创建了一个临时列表。你可以做一个
a.append(a[0])
来代替,但是你需要修改你的初始列表,这可能是个问题。相关问题 更多 >
编程相关推荐