python 中的间隔

新手上路,请多包涵

我已经对 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)]]

原文由 sharafjaffri 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 449
2 个回答

你可以试试

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]) 但随后您将修改您的初始列表,这可能是一个问题。

原文由 Pierre GM 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

 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

原文由 mgilson 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏