2015-12-04 25 views
0

我一直在爲此苦苦掙扎。我有一個帶有子列表的列表,我想在子列表的每個元素之前添加一個空格。例如:爲列表中的元素添加空格

lin = [[2], [3], [2], [2, 2], [2]] 

的結果應該是:

lin = [[' ',2], [' ',3], [' ',2], [' ',2, ' ',2], [' ',2]] 

我試着這樣做:

for a in lin: 
    for e in a: 
     e = (' ') , e 

,但我沒有改變獲得完全一樣的列表

+0

你的意思是'lin = [['',2],['',3],['', 2],['',2,'',2],['',2]]'? – TigerhawkT3

+0

完全是這樣 – marga

回答

2

我假設你實際上的意思是像Tigerhawk的評論。

你的問題是,e= (' ') , e只是覆蓋e(它最初是嵌套列表中的每個值)到包含空格和原始值的元組值。這實際上並不會改變列表中的任何內容,只是改變e最初指向的內容。

可以代替做這樣的事情:

>>> lin = [[2], [3], [2], [2, 2], [2]] 
>>> for a in lin: 
     for i in range(len(a)-1,-1,-1): 
      a.insert(i, ' ') 


>>> lin 
[[' ', 2], [' ', 3], [' ', 2], [' ', 2, ' ', 2], [' ', 2]] 

注意內循環:for i in range(len(a)-1,-1,-1):這樣做是因爲兩個原因是這樣的:

  1. 你不希望通過a實際上循環因爲你將要改變的值在a
  2. 你需要從最高的索引開始,因爲如果你從0開始,剩下的項目的索引啊它的時代將會改變。
+1

哎呀,沒有注意到那裏的[[2,2]]元素。良好的工作*胃低語* –

+1

呃哦。這個名字是堅持的。 –

+0

非常感謝您的幫助和解釋!是的,我想說的是老虎鷹說的話。再次感謝,我真的很感激。 – marga

2

您可以使用從itertools

>>> from itertools import chain 
>>> lin = [[2], [3], [2], [2, 2], [2]] 
>>> [list(chain.from_iterable([(' ', i) for i in j])) for j in lin] 
[[' ', 2], [' ', 3], [' ', 2], [' ', 2, ' ', 2], [' ', 2]] 
>>> 
0

一個整潔,實用的解決方案列表理解和chain.from_iterable,只使用內置功能

lin = [[2], [3], [2], [2, 2], [2]] 

add_spaces = lambda l: [i for x in zip(' '*len(l), l) for i in x] 
new_list = [add_spaces(l) for l in lin] 

輸出:

>>> print new_list 
[[' ', 2], [' ', 3], [' ', 2], [' ', 2, ' ', 2], [' ', 2]] 
+1

mo functions功能! 'lambda l:list(itertools.chain.from_iterable(zip(itertools.repeat(''),l)))' –

+1

@AdamSmith - 好的先生,這是一件藝術品。 – Boa

+0

(我很高興它的工作原理,因爲我把它攪拌在一起,而不是通過我的repr首先運行...) –