为什么我无法正确地将项目添加到Python列表中?

问题描述:

我只是想将项目添加到列表中,我不能!我的代码:为什么我无法正确地将项目添加到Python列表中?

import numpy as np 
    data = [[]] * 10 
    for i in range(0, len(data)): 
     slice = np.random.randn(100, 100, 3) 
     print('before: ', np.shape(data)) 
     print('slice: ', np.shape(slice)) 
     data[i].append(slice) 
     print('after: ', np.shape(data)) 

结果如下:

before: (10, 0) 
slice: (100, 100, 3) 
after: (10, 1, 100, 100, 3) 

... 

before: (10, 0) 
slice: (100, 100, 3) 
after: (10, 10, 100, 100, 3) 

所以,(100,100,3)未在data[0]插入到正确的位置,但创建额外的尺寸!为什么?我该如何避免它?

结果列表的正确的尺寸应为(10,,100,100,3) - 不(10,10 ,100,100,3)。

+1

'数据=名单()'然后'data.append(片)' – Sraw

+0

或'数据[i] = slice' – Sraw

+0

你只需要确保数据只包含10时它被初始化。然后你可以追加。 –

主要的罪魁祸首是

data = [[]] * 10 

从而创建一个空的列表,并复制它更多的9倍,因此,实际上要插入到同一列表的10倍。例如:

In [113]: data = [[]] * 10 

In [114]: data[0].append(1) 

In [115]: data 
Out[115]: [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]] 

您应该

  1. 创建一个占位符列表,然后插入在第i个元素,或
  2. 创建一个空列表[]并调用.append

但不是两者都有。

我会建议宣布一个空list

data = [[] for _ in range(10)] 

现在,调用.append在循环:

data.append(slice) 

您可以将结果转换为使用data = np.array(data)数组。这里有一个例子:

data = [[] for _ in range(10)] 

for i in range(0, len(data)): 
    slice = np.random.randn(100, 100, 3) 
    data[i].append(slice) 


print(np.array(data).shape) 
(10, 1, 100, 100, 3) 
+0

data [i] = slice将不起作用,因为我想为每个数据[i]添加许多'切片'!使用我的代码,当我试图添加10个切片时,它会添加10 * 10个切片。 – Dmitry

+0

@Dmitry这是因为你正在使用'data = [[]] * 10'创建一个列表并复制它9次,所以你访问同一个列表10次。在我的回答中,我列出了一些替代方案。 –

+0

我刚刚修复了我的问题中的严重错误。你现在看到我的问题了吗? – Dmitry