2016-10-17 119 views
0

的名單我有一個字符串,說:將一個字符串轉換列表

s = "abcdefghi"

我需要創建此這樣的列出的清單所形成的名單將: -

list = [['a','b','c'],['d','e','f'],['g','h','i']]

現在字符串可以是任何東西,但永遠有長度爲n * n個

所以如果n = 4.

len(s) = 16

的名單將是:

[['1','2','3','4'],['5','6','7','8'],...,['13','14','15','16']] 

所以在名單列表中的每個列表的長度是4

所以我想編寫一個函數,它接受字符串和n作爲輸入並且給出列表作爲輸出的列表,其中列表內的每個列表的長度是n。

如何做到這一點?

更新:

如何將上面的列表轉換回字符串?

所以如果L = list = [['a','b','c'],['d','e','f'],['g','h','i']]

如何將其轉換爲一個字符串: -

s = "abcdefghi"

我發現在計算器了一個解決方案: -

s = "".join("".join(map(str,l)) for l in list) 

謝謝大家!

+0

那你試試這麼遠嗎?它有什麼問題? –

+0

這是[itertools石斑魚配方](https://docs.python.org/2/library/itertools.html#recipes)。 – wim

回答

3

下面列出了理解,沒有工作:

[list(s[i:i+n]) for i in range(0, len(s), n)] 

如果n * n == len(s)始終是真實的,那麼只要把

n = int(len(s) ** 0.5) # Or use math.sqrt 

對於這裏的編輯部件的另一個列表理解:

''.join(e for e in sub for sub in l) 
+0

或'[list(s [n * i:(i + 1)* n])in range(len(s)// n)]' –

+0

這很快!萬分感謝 ! – skyfail

+0

是的,它是9,我的壞我認爲n是字符串長度...刪除我的評論 – dahui

0

我是numpy的個人愛好者...

import numpy as np 
s = "abcdefghi" 
n = int(np.sqrt(len(s))) 
a = np.array([x for x in s], dtype=str).reshape([n,n]) 
0
from math import sqrt 
def listify(s): 
    n = sqrt(len(s)) 
    g = iter(s) 
    return [[next(g) for i in range(n)] for j in range(n)] 

我喜歡用發電機這樣的問題