2014-10-31 30 views
-2

將其視爲在數據庫表中創建行。 我有物品清單。我們稱它爲一排。其中之一也是名單。我需要建立從內部列表中包含每個元素多行,然後將它們添加到新的更大的名單(行):如果其中一個項目也是列表,那麼如何在單個列表中創建多個行

rows = [] 
row = [1, 2, [3, 4, 5]] 

temp_row = None 
for i, v in enumerate(row): 
    if isinstance(v, list): 
     print i, v 
     for j in v: 
      temp_row = row 
      temp_row[i] = j 
      print temp_row 
      rows.append(temp_row) 

print rows 

但輸出看起來像這樣:

2 [3, 4, 5] 
[1, 2, 3] 
[1, 2, 4] 
[1, 2, 5] 
[[1, 2, 5], [1, 2, 5], [1, 2, 5]] 

你可以看到,在將行添加到行之前打印temp_row看起來是正確的。那麼爲什麼添加到最後一個數組的temp_rows不是?我試圖用字典解決它,但輸出是類似的。

+0

你的預期輸出是什麼? (即你目前的我認爲) – smushi 2014-10-31 07:22:08

+0

'temp_row = row' **不**創建副本。 – jonrsharpe 2014-10-31 08:20:02

+0

期望的輸出是一個列表中的三個中間列表。像[[1,2,3],[1,2,4],[1,2,5]] – 2014-10-31 08:20:51

回答

0

bug是在該行

temp_row = row 

你asigning temp_row來排的參考基準。這意味着他們指向完全相同的列表。如果你改變temp_row,你將改變行。因此用完全相同的引用插入三個temp_rows會給你輸出。要更改它,請在行後粘貼[:]。像這樣:

rows = [] 
row = [1, 2, [3, 4, 5]] 

temp_row = None 
for i, v in enumerate(row): 
    if isinstance(v, list): 
     print i, v 
     for j in v: 
      temp_row = row[:] 
      temp_row[i] = j 
      print temp_row 
      rows.append(temp_row) 

print rows 
相關問題