python中的间隔

sha*_*fri 1 python datetime list intervals

我已经对datetime.time的列表进行了排序,并希望创建像.如果我有

a = [datetime.time(0,0), datetime.time(8,0), datetime.time(13,0), datetime.time(17,0)]
Run Code Online (Sandbox Code Playgroud)

那么结果应该是这样的:

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)]]
Run Code Online (Sandbox Code Playgroud)

这可以通过简单的循环实现,但如果有更好的解决方案存在?

使用循环:

>>> 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)]]
>>> 
Run Code Online (Sandbox Code Playgroud)

如果我想要结果,可能会有什么变化

[[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)]]
Run Code Online (Sandbox Code Playgroud)

Pie*_* GM 8

你可以试试

a = list(zip(a[:-1], a[1:]))
a.append((a[-1], a[0])])
Run Code Online (Sandbox Code Playgroud)

这给你一个元组列表.如果你想要一个列表列表,那就行了

>>> a = [list(i) for i in zip(a[:-1], a[1:])]
>>> a.append([a[-1], a[0]])
Run Code Online (Sandbox Code Playgroud)

(编辑版本采用1. [a[-1],a[0]]列表理解和2. zip不返回Python 3+列表的事实)

另一种可能性是将第一个值附加到列表中:

>>> tmp = a + a[0]
>>> list(zip(tmp[:,-1], tmp[1:]))
Run Code Online (Sandbox Code Playgroud)

可以说它创建了一个临时列表.你可以a.append(a[0])改为做,但是你会修改你的初始列表,这可能是一个问题.

  • 虽然,我可能'a.append`列表理解之外的最后一个元素有两个原因:1)`zip`不返回py3k中的列表.(我不认为`2to3`会正确处理这个问题)2)连接创建一个新的列表,这里没有必要. (2认同)

mgi*_*son 5

为了创建这样的范围,我可能会尝试使用生成器:

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] ]
Run Code Online (Sandbox Code Playgroud)

您可以使用关键字参数来判断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
Run Code Online (Sandbox Code Playgroud)