2017-07-03 31 views
1

因此,我有一個較大的for循環,它生成各種大小的嵌套列表:如果爲空,則在子列表中輸入值

[[6], [3], [5], [3, 2, 5, 3], [5], [6, 5, 4], [5, 3, 2]] 
[[5], [], [], [4], [3]] 
[[5], [2]] 
[[], [4], [3, 2, 4] 

總之,我想它使得每個具有空子列表陣列僅僅是值0。因此,像: 如果所生成的列表是: [[6], [3], [5], [3, 2, 5, 3], [5], [6, 5, 4], [5, 3, 2]]

然後我會保持就這樣。

但是,如果產生的名單是:[[5], [], [], [4], [3]]

那麼我想它是: [[5], [0], [0], [4], [3]]

同樣,對於上面的最後一行,我希望它是:[[0], [4], [3, 2, 4]

我一直在嘗試以下幾點:

for k in range(0,len(TempAisle)): 
      if TempAisle[k][0] == None: 
       TempAisle[k][0]= 0 
k+=1 

但是我getti ng list index out of range錯誤。

這似乎是一個相當簡單的問題,並且看到其他人詢問過是否有一個空的子列表,但我無法用另一個值替換它(我的情況爲0)。任何幫助和解釋將不勝感激。

+1

'如果TempAisle [K] [0] ==無:'問如果kt的第一個值h子列表**等於「無」**值。你想檢查* sublist *是否等於一個空列表,即'[]'。從根本上說,你的誤解似乎是出於這樣的假設:如果你索引到一個空的列表中,如果這些值沒有退出,你將得到'None',但是你會得到一個'IndexError'。 –

回答

4

您可以直接迭代項目 - 更多Pythonic方式 - 無需使用range。測試的每個項目中的所述感實性(空列表是falsy),並附加零隻有在子列表爲空:

for x in TempAisle: 
    if not x: 
     x.append(0) 
+0

謝謝,這個工作很完美,但是附加值0和不等於0的區別究竟是什麼? – Questions

+0

@PythonQuestions你不需要測試它是否等價於任何東西。足夠了解清單是空的;如果我正確理解你的問題。 –

+0

@MosesKoledoye我認爲問題是「爲什麼x.append(0)'而不是'x = [0]'」,答案是隻有前者實際上改變了「TempAisle」的一個元素,而後者只是改變臨時變量'x'。 –

3

對於一個行的解決方案:

x = [elem or [0] for elem in TempAisle] 

基於@Moses Koledoye的評論編輯,以避免創建一個新的列表,但要保持其作爲一個在線解決方案:

[x.append(0) for x in TempAisle if not x] 
+2

很酷的單線程,但並不總是需要設置一個新列表,特別是當它是一個列表列表,並且沒有明確要求新列表時。 –

+0

你是對的。這是習慣的力量,與小列表一起工作,變量很少......但在其他情況下,可能是一個壞主意。好決定。 –

相關問題