我已经对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)]]
答案 0 :(得分:8)
你可以尝试
a = list(zip(a[:-1], a[1:]))
a.append((a[-1], a[0])])
这会给你一个元组列表。如果您想要列表,请执行
>>> a = [list(i) for i in zip(a[:-1], a[1:])]
>>> a.append([a[-1], a[0]])
(编辑版本1.将[a[-1],a[0]]
排除在列表理解之外,以及2. zip在Python 3 + 中不返回列表的事实
另一种可能性是将第一个值附加到列表中:
>>> tmp = a + a[0]
>>> list(zip(tmp[:,-1], tmp[1:]))
可以说它创建了一个临时列表。您可以改为a.append(a[0])
,但之后您会修改初始列表,这可能是一个问题。
答案 1 :(得分:3)
为了创建这样的范围,我可能会尝试生成器:
def make_ranges(lst):
max_idx = len(lst) - 1
for i,item in enumerate(lst):
yield [item, lst[i+1 if i != max_idx else 0] ]
您可以使用关键字参数来告诉make_ranges
是否是周期性的,如果是周期性的,是否在开头或结尾包含回绕。
然后你可以制作你的范围:
a = [1,2,3,4,5,6,7,8]
b = list(make_ranges(a))
print(b == [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,1]]) #True
答案 2 :(得分:3)
另一个选项 1 作为一个单行:但是真正的unpythonic表达式(imho),这样你就不必附加最后一对和第一对在一个单独的步骤中:
>>> [list(i) for i in zip(a, a[1:]+[a[0]])]
[[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)]]
1 zip
方法inspired by Pierre-GM's solution above。
仅供参考,我更喜欢my initial answer或皮埃尔。
问题的第二部分的编辑/更新:在一个表达式中也执行timedeltas(但我认为没有充分的理由为什么这不应该只是分成不同的语句而是... 。):
>>> [[i, (datetime.datetime(101, 1, 1, j.hour, j.minute, j.second) -
... datetime.timedelta(seconds=1)
... ).time()
... ] for i,j in zip(a, a[1:]+[a[0]])
... ]
[[datetime.time(0, 0), datetime.time(7, 59, 59)],
[datetime.time(8, 0), datetime.time(12, 59, 59)],
[datetime.time(13, 0), datetime.time(16, 59, 59)],
[datetime.time(17, 0), datetime.time(23, 59, 59)]]
答案 3 :(得分:2)
如果不是'简单循环',列表理解怎么样?像:
>>> b = [[a[x], a[x+1]] for x in range(0, len(a)-1)] + [[a[-1], a[0]]]
>>> b
[[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)]]