在python中创建2d数组?

时间:2010-10-04 21:33:05

标签: python

这是我试图创建2d矩阵的代码

m=4
tagProb=[[]]*(m+1)
count=0
index=0
for line in lines:
    print(line)
    if(count < m+1):
       tagProb[index].append(line.split('@@')[2].strip()) 
       count+=1
    if(count == m+1): // this check to goto next index
        count = 0
        index+=1
print(tagProb)  

我得到了o / p

[['0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', '0.0', '0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', 0.0'], ['0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', .0', '0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', '0.0'], '0.0', '0.6', '0.05', '0.3', '0.05', '0.1', '0.0', '0.6', '0.0', '0.0', '0.1', '0.0', '0.0','0.9', '0.0', '0.1', '0.0', '0.2', '0.7', '0.0', '0.1', '0.0', '0.9', '0.0', '0.0'] ]

附加了所有值,列表具有相同的值。 我怎么能避免这个?

3 个答案:

答案 0 :(得分:10)

您在列表上使用*,它有一个问题 - 它将列出许多对相同对象的引用。这适用于inttuple等不可变项,但不适用于像list这样的可变项,因为更改其中一个对象会改变所有对象。参见:

>>> foo = [[]]*10
>>> foo[0].append(1)
>>> foo
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]

如果您不希望这种情况发生,那么避免它的标准方法是使用列表推导,它将使用新对象初始化列表:

>>> bar = [[] for _ in range(10)]
>>> bar[0].append(1)
>>> bar
[[1], [], [], [], [], [], [], [], [], []]

然而,这个问题在惯用Python中并不是很有用,因为初始化大型列表并不常见 - 这是一种C心态。 (这并不是说它有时候不是正确的事情 - Python是多范式的!)

另一方面,你的代码并不好。 Python中的for循环旨在处理对象的迭代,这样您就不必手动管理索引变量(代码中的indexcount)。最好改写如下:

import numpy as np
m = 4
tagProb = np.array(list(line.split("@@")[2].strip() for line in lines)))
tagProb = tagProb.reshape((m+1,-1)).T

说明:第一行将tagProb定义为一维的numpy数组(一种具有大量线性代数函数的快速基于C的数组类型),其中所有值都在一行中。第二行将它强制转换为高度m+1和推断宽度的矩阵(注意它必须是正方形才能工作;如果需要,可以用None填充它)然后转置它。我相信这就是你的迭代所做的,但它有点难以理解 - 让我知道你是否想要这样做。

答案 1 :(得分:1)

一次创建一个列表并插入它们:

import copy
m=4
tagProb=[]
count=0
index=0
for line in lines:
    print(line)
    innerlist = []
    if(count < m+1):
       innerlist.append(line.split('@@')[2].strip()) 
       count+=1
    if(count == m+1): // this check to goto next index
        count = 0
        index+=1
        tagProb.append(copy.deepcopy(innerlist))
        innerlist = []
print(tagProb)  

如您所见,添加了innerlist,然后对于每一行,它将列表添加到列表列表中。 (你可能想要做一个列表副本。)

答案 2 :(得分:0)

m=4
tagProb=[]
count=0
index=0
 innerlist = []
for line in lines:
print(line)

if(count < m+1):
   innerlist.append(line.split('@@')[2].strip()) 
   count+=1
if(count == m+1): // this check to goto next index
    count = 0
    index+=1
    tagProb.append(innerlist)
    innerlist = []
print(tagProb)