假设您有一个按递增顺序排列的值列表,除了它们在某些时候它们包裹了wround
2, 4, 6, 9, 12, 15, 34, -2, 1, 4, 5, 7, ...
知道周期是2 ^ n,对于n的某个值,是否有任何内置函数,或者是重新排列上述值的快速方法,以便所有数字按递增顺序排列(假设数字是这样的有可能的)?
答案 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()