2012-10-18 50 views
-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')) 

輸出是種正確然而它重複次e輸出超過200行(幾乎是800行)。我看不出如何糾正它。

+0

你不會碰巧在做矩陣數學?如果是這樣,試着看看NumPy/SciPy的確如此:)它比原始python列表更高級別 –

+0

目前還不清楚你在問什麼。首先,垂直/矩陣顯示是你問題的一部分,還是不是?是否只是交換列表中某些元素的順序? – ely

+0

沒有它的圖像處理ppm文件。試圖通過使用列表或創建函數來進行水平翻轉,而不使用內置的python模塊(這會讓它變得太簡單) – user1753878

回答

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 

找出它是如何實現的正是扭轉是一個練習你:)

+0

我的帖子底部的代碼做倒車,但它只是重複更長的時間,然後它應該。 – user1753878

+0

這需要更多的思考比我的很多,感謝你真正搞清楚塊開始和儘管它只能用於類似列表的對象,而不是任意的迭代器(+1無論如何) – mgilson

+0

@mgilson,這個代碼是一個更快的訂單。 – Oz123

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]) 
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元素。