环绕检测

时间:2012-04-26 21:53:19

标签: python overflow

假设您有一个按递增顺序排列的值列表,除了它们在某些时候它们包裹了wround

2, 4, 6, 9, 12, 15, 34, -2, 1, 4, 5, 7, ...

知道周期是2 ^ n,对于n的某个值,是否有任何内置函数,或者是重新排列上述值的快速方法,以便所有数字按递增顺序排列(假设数字是这样的有可能的)?

4 个答案:

答案 0 :(得分:5)

list.sort()可能足够快。在CPython中,它是使用Timsort实现的,它应该以比平均值更好的方式处理像你这样的情况(第一阶段正在查找与你的情况完全相同的已经排序的数字运行)。

答案 1 :(得分:2)

预期输出有助于理解您的问题。我猜到了一个与其他人不同的理想解决方案。也许其他人可以为这种解释找到更简洁的解决方案。

输出将是 2,4,6,9,12,15,34,62,65,68,69,...... 即,从-2开始的所有值都向上移动64

首先我猜周期大小为64.这可以通过例如通过查看邻居元素的最负面差异并向上舍入为2的幂。如果您在开头没有所有可用值,则可能无法实现。

period = 64

def unwrap(seq):
    it = iter(seq)
    try:
        lastitem = next(it)
    except StopIteration:
        return
    yield lastitem
    shift = 0
    for item in it: 
        if item < lastitem:
            shift += period
        yield item + shift
        lastitem = item

如果您需要列表而不是生成器,则可以使用

result = list(unwrap(original_list))

答案 2 :(得分:0)

如果您希望所有值按递增顺序排列,那就是一种排序:

>>> sorted([2, 4, 6, 9, 12, 15, 34, -2, 1, 4, 5, 7])
[-2, 1, 2, 4, 5, 6, 7, 9, 12, 15, 34]

您是否尝试根据知识来优化排序,它是连续数字间隔包装,还是提出不同的问题?

答案 3 :(得分:0)

>>> sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]

>>> a = [5, 2, 3, 1, 4]
>>> a.sort()