我正在使用此代码创建一个python矩阵(5行,2列):
[[0 for x in xrange(2)] for x in xrange(5)]
有人可以解释那部分0 for x in xrange(2)
以及当我尝试按照以下方式执行此操作时它无效的原因:
[[0 for x in xrange(2)] 0 for x in xrange(5)]
答案 0 :(得分:4)
这里有嵌套列表理解。第一位
[0 for x in xrange(2)]
创建长度为2的列表,每个条目设置为0.此列表设置为第二个列表推导的值。以下结果将产生相同的结果:
zeros2 = [0 for x in xrange(2)]
# create 5 copies of zeros2
zeros2x5 = [zeros2[:] for x in xrange(5)]
答案 1 :(得分:4)
问题中的代码是嵌套列表解析。以Python为例
[x*x for x in range(10)]
返回
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
该语法表示"收集x*x
的值,其中x
是range(10)
"
你当然可以写一些像
这样的东西[42 for x in range(10)]
将提供
[42, 42, 42, 42, 42, 42, 42, 42, 42, 42]
(这与上面完全相同,只是在您要收集的表达式中未使用值x
)
"列表理解"然而,它本身就是一个表达式,因此它可以用于另一个外部列表理解...例如
[[x*y for x in range(3)] for y in range(4)]
将返回
[[0, 0, 0],
[0, 1, 2],
[0, 2, 4],
[0, 3, 6]]
在数值常量(或任何其他不可变)的特殊情况下,您可以使用更简单的形式来构建矩阵:
[[0] * 3 for x in range(4)]
返回
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]
因为将列表乘以整数n
,您会得到一个由连接的原始列表的n
个副本组成的列表(因此[0]*5
会返回{{ 1}})。
请注意,然而显然是相似的
[0, 0, 0, 0, 0]
不会做同样的事情。原因是虽然仍显示为
[[0] * 3] * 4
在这种情况下,外部列表将由对同一行的4个引用组成,而不是4个独立的行。这意味着在代码
之后[[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]
x = [[0] * 3] * 4
x[0][0] = 9
包含
x
而不是
[[9, 0, 0],
[9, 0, 0],
[9, 0, 0],
[9, 0, 0]]
因为由独立行组成的真实矩阵会发生这种情况。
答案 2 :(得分:2)
[0 for x in xrange(2)]
表示“为(0,1)中的每个元素写一个带有”0“的列表”,因此将创建一个包含2个条目的列表,两个都为“0”。
所以你可以看到
[[0 for x in xrange(2)] for x in xrange(5)]
创建一个包含6个条目的列表。
是每个条目的结果[0 for x in xrange(2)]
最后你有一个列表,包含5个列表,包含2个零。
在你的代码中,第二个“0”毫无意义。
答案 3 :(得分:1)
Ar = []
Ar.append([1,2,3,4])
Ar.append([2,5,6,7])
Ar.append([3,8,10,11])
Ar.append([4,9,12,13])
通过使用list apprehension创建列表列表,我能够像
那样编制索引print Ar[2][2]
输出
10
答案 4 :(得分:-1)
m=int(input("Enter row"))
n=int(input("Enter column"))
a=[] #Blank Matrix
for i in range(m):#Number of Row Input
b=[]#Blank List
for j in range(n):#Number of col Input
j=int(input("Enter Number in Pocket ["+str(i)+"]["+str(j)+"]")) #Show Row an col Number
b.append(j)#add Row Element
a.append(b)#Add list In Matrix
print(a)#Print Matrix