考虑以下列表
[[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行)。我看不出如何纠正它。
答案 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])