查找集合的范围,其中集合中的值环绕模数

时间:2015-12-17 15:09:10

标签: python modulo

我有一个Python集,其中包含代表24小时制小时的数字,例如

s = set([1, 3, 8, 23])
s
>>> {1, 3, 8, 23}

我想找到覆盖每一小时的最小小时范围的大小。通常我可以使用

max(s) - min(s)
22 

但在这种情况下,允许最小范围绕模数(午夜),所以答案是错误的。正确答案是所有值都在23到8之间,所以最小范围是9小时。

有没有一种有效的方法来使用Python计算它?

3 个答案:

答案 0 :(得分:1)

  • 对该集进行排序并追加另一天的第一个小时(l[0] + 24
  • 发现差异
  • 结果是24 - 最大差异
>>> l = sorted(s)
>>> l.append(l[0] + 24)
>>> 24 - max(b-a for a,b in zip(l, l[1:]))
9

答案 1 :(得分:0)

这是一个解决方案。 首先,请列出您的小时数:

s = set([1, 3, 8, 23])
sortedhours = sorted(s)

然后,在午夜左右完成所有这些时间的包装:

twodays = sortedhours + [h+24 for h in sortedhours]
allwraps = [twodays[i-len(s):i] for i in range(len(s), len(twodays))]

然后,做你要求做的事情,即计算午夜所有环绕的最小范围:

min(map(lambda l: max(l)-min(l), allwraps))
# 9

答案 2 :(得分:-1)

我认为你必须将每个元素作为一个起点,并考虑范围是什么:

l = sorted(s)
ans = l[-1] - l[0]
for i in range(len(l)):     # I know that's horrible normally
    wrapped = l[i-1] - l[i] + 24
    if wrapped < ans:
       ans = wrapped