2014-10-31 66 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 
相关问题