如何反转整个列表的特定范围的列表?

时间:2012-10-18 19:12:59

标签: python list list-comprehension

考虑以下列表

    [[4,4,4],[5,5,5],[6,6,6],[7,7,7]......] 

我想每隔第N行替换一次订单:

    5 5 5 
    4 4 4 
    7 7 7 
    6 6 6 

一般的想法是从200行的列表中取20行并反转订单列表[0:20:-1]并继续这个直到列表完成,因此只能进行10次:

for i in range(length-1):
    tobeflipped=num[:20:-1]
    num=num[20:]
for i in tobeflipped:
    f.write(''.join(str([d for d in i]).strip('[]').replace (',','')+'\n'))

输出是正确的,但它重复输出超过200行(几乎是800行)。我看不出如何纠正它。

3 个答案:

答案 0 :(得分:3)

我的版本更改了您的列表:

def block_reverse(lst, blocksize):
    for i in range(blocksize-1, len(lst), blocksize):
        if i<blocksize:
            lst[:blocksize]=lst[blocksize-1::-1]
        else:
            lst[i-blocksize+1:i+1] = lst[i:i-blocksize:-1]

m=[[4,4,4],[5,5,5],[6,6,6],[7,7,7]]
block_reverse(m, 2)
print m

找出它如何完全实现逆转是一项练习:)

答案 1 :(得分:2)

我会使用发电机:

def revsec(blocksize,lst):
    block = []
    for i,elem in enumerate(lst):
        if i % blocksize:
            block.append(elem)
        else:
            #python 3.3 note -- use `yield from block[::-1]` instead.
            for item in block[::-1]:  #reversed(block) might be better here
                yield item

            block = [elem]

    #yield any stragglers.        
    for item in block[::-1]:        #reversed(block) might be better here too
        yield item

a = range(200)
print list(revsec(20,a))

这有一些优点。首先,输入“列表”不必是列表。它可以是任何迭代器。这也会返回一个迭代器,因此它实际上只需要在任何给定时间缓存blocksize个元素。

答案 2 :(得分:0)

num = [[4,4,4],[5,5,5],[6,6,6],[7,7,7]]

for e, u in zip(num[::2], num[1::2]):
   print ' '.join(["%s" %i for i in u])
   print ' '.join(["%s" %i for i in e])