如何修改列表

时间:2016-02-25 18:00:17

标签: python list

我是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中的作用域的东西。但是,对于范围界定或上述问题,我没有得到适当的答案。

5 个答案:

答案 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]]