如何在lis中修改列表中的元素

2024-04-23 10:47:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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]"行上方放置了一个print语句,用于打印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中作用域的东西。但我没有得到合适的答案,无论是范围界定或上述问题。你知道吗


Tags: 答案代码inforindexlenrange语句
3条回答

您正在用语句修改列表-L[a][b] = L[a][b] + L[a][b] e、 g.-

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

正如其他人所解释的,当您使用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函数。它将为您提供一个迭代器,当您在列表中移动时,它将返回索引值。你知道吗

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

实现所需输出的最佳方法是使用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,并将sublist中的每个el乘以2,从而获得所需的结果。你知道吗

相关问题 更多 >