我是Python的新手,试图学习基础知识。对列表有疑问。
有一个清单:
L = [[1,2,3],[4,5,6],[3,4,6]]
输出应为:
[[2,4,6],[8,10,12],[6,8,12]]
适用于我的代码如下
for x in range(len(L)):
for y in range(len(L[x])):
L[x][y] = L[x][y] + L[x][y]
print L
它提供输出[[2,4,6],[8,10,12],[6,8,12]]
。
现在我希望使用不同的代码输出相同的输出:
for x in L:
a = L.index(x)
for y in L[a]:
b = L[a].index(y)
L[a][b] = L[a][b] + L[a][b]
print L
使用上面的代码,获得的输出是:
[[4,2,6],[8,10,12],[12,8,6]]
我尝试调试上面的输出。
我在行"L[a][b] = L[a][b] + L[a][b]"
上方放置了一个打印语句,用于打印a和b。我很惊讶地看到a和b的值是:
0,0
0,0
0,2
1,0
1,1
1,2
2,0
2,1
2,0
如果我注释掉"L[a][b] = L[a][b] + L[a][b]"
行,那么a和b的值就像预期一样:
0,0
0,1
0,2
1,0
1,1
1,2
2,0
2,1
2,2
我怀疑这可能是由于python中变量的范围而发生的,并试图研究一些关于python中的作用域的东西。但是,对于范围界定或上述问题,我没有得到适当的答案。
答案 0 :(得分:1)
您使用声明修改列表 - L[a][b] = L[a][b] + L[a][b]
例如 -
L = [[1, 2, 3], [4, 5, 6], [3, 4, 6]]
最初是 L[0][0] = 1
然后将其修改为L [0] [0] = 2
L = [[2, 2, 3], [4, 5, 6], [3, 4, 6]]
在下一个循环中,您搜索索引为2,现在为0,0因为您修改了列表L. 我试图在你的例子中打印L和a,b。结果解释了行为 -
0 0
[[1, 2, 3], [4, 5, 6], [3, 4, 6]]
0 0
[[2, 2, 3], [4, 5, 6], [3, 4, 6]]
0 2
[[4, 2, 3], [4, 5, 6], [3, 4, 6]]
1 0
[[4, 2, 6], [4, 5, 6], [3, 4, 6]]
1 1
[[4, 2, 6], [8, 5, 6], [3, 4, 6]]
1 2
[[4, 2, 6], [8, 10, 6], [3, 4, 6]]
2 0
[[4, 2, 6], [8, 10, 12], [3, 4, 6]]
2 1
[[4, 2, 6], [8, 10, 12], [6, 4, 6]]
2 0
[[4, 2, 6], [8, 10, 12], [6, 8, 6]]
答案 1 :(得分:0)
获得所需输出的最佳方法是使用list comprehension。你可以这样做:
L = [[1,2,3], [4,5,6], [3,4,6]]
answer = [[2*el for el in sublist] for sublist in L]
print(answer)
<强>输出强>
[[2, 4, 6], [8, 10, 12], [6, 8, 12]]
这会迭代列表sublist
中的每个L
,并将el
中的每个sublist
乘以2,从而获得所需的结果。
答案 2 :(得分:0)
我认为以下代码可能会更好 对于L中的x:#iterate over orig list for x in x:#iterating over inner list [x] [y] = [x] [y] + [x] [y]
答案 3 :(得分:0)
正如其他人所解释的那样,当您使用index
函数时,它会找到您要搜索的值的第一个匹配项。所以第一次通过你循环(对于第一行),它看起来像
b = 1
[1,2,3].find(1) # returns index 0
#Then you modify the first element of the list
b = 2
[2,2,3].find(2) #returns index 0 again!
为了以更简单,更确定的方式获取索引,您可以在列表中使用enumerate
函数。它将为您提供一个迭代器,当您在整个列表中移动时,该迭代器将返回索引 AND 值。
for rowInd, x in enumerate(L):
for colInd, y in enumerate(x):
L[rowInd][colInd] = y + y
请注意,这将在原始解决方案中完成。
L = [[2,4,6],[8,10,12],[6,8,12]]
答案 4 :(得分:0)
如果您坚持使用第二种方法,则需要将结果存储在临时变量中:
L = [[1, 2, 3], [4, 5, 6], [3, 4, 6]]
M = [[0 for y in range(3)] for x in range(3)]
for x in L:
a = L.index(x)
for y in L[a]:
b = L[a].index(y)
M[a][b] = L[a][b] + L[a][b]
L = M
print L
输出:
[[2, 4, 6], [8, 10, 12], [6, 8, 12]]