-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 に答える