-1

考虑以下列表

    [[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 行)。我看不到如何纠正它。

4

3 回答 3

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

找出它是如何实现倒车的对你来说是一个练习:)

于 2012-10-18T19:44:13.003 回答
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在任何给定时间缓存元素。

于 2012-10-18T19:27:35.600 回答
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])
于 2012-10-18T19:22:12.797 回答