有没有更好的方法在python中实现数组?



我的方法是:

def transpose(m):
output = [["null" for i in range(len(m))] for j in range(len(m[0]))]
for i in range(len(m[0])):
for j in range(len(m)):
if i==j:
output[i][j]=m[i][j]
else:
output[i][j]=m[j][i]
return(output)

上面的方法创建一个数组/列表作为占位符,以便可以添加新的值。我尝试了这种方法,因为我是python的新手,以前学习Java,它有内置数组,但python没有,我发现没有简单的方法来索引2D列表,类似于我们在Java中所做的,除非我们预定义列表(像在Java中一样,但必须使用一些for循环)。我知道有实现数组的包,但我对语言相当陌生,所以我试着用我熟悉的方式模拟它。

所以我的主要问题是,有没有更好的方法来预定义列表限制的类型大小(如java中的数组)没有这些时髦的for循环。或者一个更好的方法,有预定义的列表,我可以很容易地索引,而不需要追加列表内列表和所有这些东西。这对我来说真的很难,因为它不像我想要的那样运行。

我还做了一个辅助方法来预构建列表,像这样:

def arraybuilder(r,c,jagged=[]): #builds an empty placeholder 2D array/list of required size
output=[]
if not jagged:
output = [["null" for i in range(c)] for j in range(r)]
return(output)
else:
noOfColumns=[]
for i in range(len(jagged)):
noOfColumns.append(len(jagged[i]))
for i in range(len(jagged)):
row=[]
for j in range(noOfColumns[i]):
row.append("null")
output.append(row)
return(output,noOfColumns)#returns noOfColumns as well for iteration purposes    

2d可迭代对象的典型换位模式为zip(*...):

def transpose(m):
return [*map(list, zip(*m))]
# same as:
# return [list(col) for col in zip(*m))]

zip(*m)解包嵌套列表并将它们压缩(交错)到列元组中。由于zip返回元组上的惰性迭代器,因此我们在将所有元组转换为列表的同时将其消费为列表。

如果你想更明确,有更简洁的方法来创建嵌套列表。下面是一个嵌套式推导式:

def transpose(m):
return [[row[c] for row in m] for c in range(len(m[0]))]

最新更新