2014-01-30 33 views
2

我正在學習列表理解,它非常快,但我試圖插入值到子列表中,它顯示該子列表None。這裏是我試圖,列表理解表達顯示沒有任何值子列表

def tester(lst): 
     print [ x if x%2 else x*100 for x in range(1, 10) ] # It is working 
     #output: [1, 200, 3, 400, 5, 600, 7, 800, 9] 
     print [ls.insert(2,"Null") for ls in lst] 
     #output: [None, None] 


lst = [['a','c','d'],['1','2','3']] 

tester(lst) 

爲什麼它顯示[None, None]?以及爲什麼它不顯示[['a','c','d', 'Null'],['1','2','3', 'Null']]

回答

2

list.insert就地修改列表並返回None

>>> lis = range(5) 
>>> repr(lis.insert(2, 'null')) # returns None 
'None' 
>>> lis       # But the list is affected. 
[0, 1, 'null', 2, 3, 4] 

使用一個簡單的for循環的位置:

for ls in lst: 
    ls.insert(2, "Null") 

你可以用一個列表理解做到這一點,但我更喜歡正常環路版本:

>>> lst = [range(5) for _ in range(5)] 
>>> [ls for ls in lst if not ls.insert(2, 'null')] 
[[0, 1, 'null', 2, 3, 4], [0, 1, 'null', 2, 3, 4], [0, 1, 'null', 2, 3, 4], [0, 1, 'null', 2, 3, 4], [0, 1, 'null', 2, 3, 4]] 

此處,當檢查if條件時,該項目被插入到當前列表中,並且由於list.insert返回None,因此not None始終爲True

更新:

要更新您需要使用三元表達式根據條件列表對象:

>>> lst = [['a','c','d'],['1','2','3'], [1, 2, 3, 4]] 
>>> [ls if (len(ls) == 3 and not ls.insert(2, 'null')) else ls for ls in lst] 
[['a', 'c', 'null', 'd'], ['1', '2', 'null', '3'], [1, 2, 3, 4]] 
+0

+1了一個簡單的for循環。如果你使用列表理解並放棄結果列表,那麼你做錯了。 –

+0

@Ashwini喬杜裏感謝您的時間回答這個問題,當我嘗試這個'[ls ls in lst if(len(ls)== 3)ls.insert(2,「Null」)]',但錯誤是上調。 – codeimplementer

+0

@codeimplementer你需要''和'那裏:'如果len(ls)== 3而不是ls.insert(2,「null」)' –