以特定方式重新排序范围

问题描述 投票:-3回答:1

我正在寻找一种方法来重新排序给定范围,以获得第一个,最后一个,中间一个,然后是中间的中间部分......等等。如果我们看看0-15范围,它将是这样的:所以邻居成员只会在最后一次迭代时出现。

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

0 15 8 4 12 2 6 10 13 1 3 5 7 9 11 14

对于一个好算法的任何想法?

python algorithm
1个回答
1
投票

这是一个使用队列而不是递归的解决方案。

13和14的位置与你的例子不同,但是如果你一直认为偶数长度列表的中间是中间的元素,那么14首先是:

import collections

def reorder(seq):
    '''Yield items from seq reordered to http://stackoverflow.com/q/33372753/
    seq can be any sequence, eg. a list or a Python 3 range object.
    '''
    # output first and last element before all the middles
    if seq:
        yield seq[0]
    if len(seq) > 1:
        yield seq[-1]

    # a queue of range indices (start, stop)
    queue = collections.deque([(1, len(seq)-1)])
    while queue:
        start, stop = queue.popleft()
        if start < stop:
            middle = (start + stop) // 2
            yield seq[middle]
            queue.append((start, middle))
            queue.append((middle+1, stop))

print(list(reorder(range(16))))
#[0, 15, 8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13]    
© www.soinside.com 2019 - 2024. All rights reserved.