使用python循环遍历两个列表,使用一个作为列表列表的索引,另一个作为要追加的值

时间:2012-03-18 17:32:53

标签: python list zip append

我在使用zip命令获得预期结果时遇到了一些麻烦。案例1-3是有道理的,但在第4和第5案例中(我假设它们是等价的?)我希望结果是[['a'],['b'],['c'],['d' ]],而是将整个第二个列表附加到我初始化的列表列表的每个子列表中。

案例1:

>>> for a in zip([1,2,3,4],['a','b','c','d']):
...     print a

(1, 'a')
(2, 'b')
(3, 'c')
(4, 'd')

案例2:

>>> for (a,b) in zip([1,2,3,4],['a','b','c','d']):
...     print a,b
... 
1 a
2 b
3 c
4 d

案例3:

>>> temp = [[]] * 4
>>> for (a,b) in zip([0,1,2,3],['a','b','c','d']):
...     temp[a] = b
... 
>>> temp
['a', 'b', 'c', 'd']

案例4:

>>> temp = [[]] * 4
>>> for (a,b) in zip([0,1,2,3],['a','b','c','d']):
...     temp[a].append(b)
... 
>>> temp
[['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd']]

案例5:

>>> temp = [[]] * 4
>>> for a,b in zip([0,1,2,3],['a','b','c','d']):
...     temp[a].append(b)
... 
>>> temp
[['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd']]

4 个答案:

答案 0 :(得分:3)

[[]] * 4创建对单个对象的引用列表:

>>> l = [[]] * 4
>>> l
[[], [], [], []]
>>> l[0].append(1)
>>> l
[[1], [1], [1], [1]]

请尝试[[] for _ in range(4)]

答案 1 :(得分:1)

temp = [[]] * 4

这将创建一个列表,其中包含对同一列表对象的四个引用。您只有一个“子列表”在“主列表”中包含四次。这与此示例中的情况相同:

>>> ls = []
>>> tmp = [ls, ls, ls, ls]
>>> ls.append(1)
>>> tmp
[[1], [1], [1], [1]]

您可能希望为列表元素使用单独的列表对象。例如,可以通过这种方式创建这样的列表:

tmp = [[] for _ in range(4)]

答案 2 :(得分:1)

你遇到了Python处理变量名和引用的方式。如果您以前使用过C风格的语言,可能会让人感到困惑,但如果您不这么认为,那就很有意义了!

Python有“东西”和“事物名称”。例如,x是一个名称,[]是一个东西,x=[]将名称x分配给事物[]

列表乘法语法在名称和事物方面有点令人困惑。让我们把它展开来看看它是如何工作的:

name = [x]*4
     

相同
_temp = x
name = [_temp, _temp, _temp, _temp]

考虑到这一点,以下代码应该有意义:

>>> x = []
>>> y = [x]*4
>>> y[0].append(1)
>>> y
[[1], [1], [1], [1]]

为什么呢?好吧,当你写y=[x]*4]时,你会列出四个名字。但这些都是相同事物的名字!如果.append(1)指向由名字命名的对象,则更改所有名称的对象,即名称。

现在,和以前一样,

name = [[]]*4
     

相同
_temp = []
name = [_temp, _temp, _temp, _temp]

您尚未明确创建新名称。但你已经这样做了含蓄地!您只需拨打[]一次,因此您只需制作一个新列表。然后,您可以列出四个名称,每个名称都是您刚刚创建的新空列表。因此,所有名字都指出同样的事情也就不足为奇了!


你说怎么解决这个问题?好吧,您需要为所需的每个新列表调用[]一次。为此,请使用列表解析:

[[] for _ in range(4)]

请注意,_只是另一个名称,尽管它通常用于您不关心的事情。

答案 3 :(得分:0)

这是因为当您创建temp = [[]] * 4时,您创建一个列表,其中包含对同一(空)列表的4个引用。