2012-10-03 146 views
0

我想將列表l重新排列成列表n列表,其中n是列數。將python列表重新排列爲n個列表,列

例如,

l = [1,2,3,4,5,6,7,8,9,10] 
n = 4 
==> [[1,5,9],[2,6,10],[3,7][4,8]] 

是否有人可以幫助我的算法?隨意使用任何可用的python awesomeness;我敢肯定,一些很酷的機制很適合這個,我想不起來。

PS示例列表恰好是從1開始的有序數字。這不是我的實際場景。

回答

5

在Python中確實有一個很酷的機制:切片的三參數形式,其中最後一個參數是步長。

>>> l = [1,2,3,4,5,6,7,8,9,10] 
>>> n = 4 
>>> [l[i::n] for i in xrange(n)] 
[[1, 5, 9], [2, 6, 10], [3, 7], [4, 8]] 
+0

我實際上正在嘗試使用那個(第三個slice參數),但最終會出現一些更復雜的工作。謝謝! –

1

下面的函數的確要達到什麼樣的:

def rearrange(seq,n): 
    return [[v for i,v in enumerate(seq[x:]) if i%n==0] for x in xrange(len(seq))][:n] 
1
l = [1,2,3,4,5,6,7,8,9,10] 
n = 4 

def f(l,n): 
    A = [] 
    [A.append([]) for i in xrange(n)] 
    [ A [(i - 1) % n].append(i) for i in l] 
    return A 

print f(l,n) 

[[1,5,9],[2,6,10],[3,7],[4, 8]]

0

寫Python不是代碼高爾夫的遊戲,爲了可讀性的原因,不要害怕使用多行代碼。

l = [1,2,3,4,5,6,7,8] 

def split_into_columns(input_list, num_of_cols=3): 
    retval = [ [] for _ in xrange(num_of_cols)]  # build 3 columns 
    for i in xrange(len(input_list)):    # iterate through original list 
     retval[i%num_of_cols].append(input_list[i]) # place in the "modulo 3" column 
    return retval 

    # here's a compressed, less readable version of that for-loop 
    #[retval[i%3].append(input_list[i]) for i in xrange(len(input_list))] 
    #return retval 

print split_into_columns(l, 3)