在嵌套 python 列表的外部维度上使用切片赋值时出现意外结果
Unexpected result when using slice assignment on outer dimension in nested python lists
在 python 3.7.2 中使用以下代码时,赋值会被静默忽略。这是预期的结果吗?
>>> x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> x
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> x[:][1]=17
>>> x
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
是否有更好的方法使用切片来实现将第 2 列替换为 17 的预期结果?顺便说一句,我在使用 [17, 17, 17] 匹配维度时得到相同的结果。
编辑:只是为了避免一些混淆。预期结果是 [[1, 17, 3], [4, 17, 6], [7, 17, 9]].
你在找这个吗?:
x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
y=[[l[0],17,l[2]] for l in x]
print(y)
结果是:
[[1, 17, 3], [4, 17, 6], [7, 17, 9]]
x[:]
创建原始列表的副本,并在适当位置修改新列表。
但是,这个创建的列表是不可访问的(因为没有对它的引用)。
如果您想将第二个子列表作为 [17,17,17]
即
x[0] = [17 for _ in x[0]]
但如果您希望它只是 [17]
,那么
x[0] = [17]
编辑:好的,看来我有点误解了这个问题,看来你想
将其视为一种矩阵。对于常规 python 列表和嵌套列表,没有这样的语法糖,您必须创建一个 for 循环:
for sublist in x:
sublist[1] = 17
对于列表理解,您需要创建一个副本,而这在 IMO 中是不需要的。但如果你想要那个
copied_and_modified_x = [[sublist[0], 17, sublist[2]] for sublist in x]
id(x)
和id(x[:])
不同,因为x[:]
创建了x
的浅拷贝。所以,当你写
x[:][0][1] = 17
您正在创建 x
的新浅表副本,并将第一个子列表的第一个元素修改为 17。但是,新结果 result 没有引用,因此无法访问它的内容.
您可以这样做以获得您想要的结果:
a = x[:] # creates a shallow copy of x
a[0][1] = 17
print(x, id(x))
print(a, id(a))
输出:
[[1, 17, 3], [4, 5, 6], [7, 8, 9]] 139933444652552
[[1, 17, 3], [4, 5, 6], [7, 8, 9]] 139933416357064
如果您想要的结果是
,则没有理由使用列表切片
x = [[1, 2, 3], [17, 17, 17], [7, 8, 9]]
你应该这样做:
x[1] = [17,17,17]
当您使用切片时,它会创建一个等于 x 的新对象,因此它不会保存在 x 变量上。
list1 = [[1,2,3], [4,5,6], [7,8,9]]
x, y = len(list1)-1, 0
while y <= x:
print(list1[y][1], end=" ")
y = y+1
输出:
2 5 8
我想这对你有帮助
在 python 3.7.2 中使用以下代码时,赋值会被静默忽略。这是预期的结果吗?
>>> x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> x
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> x[:][1]=17
>>> x
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
是否有更好的方法使用切片来实现将第 2 列替换为 17 的预期结果?顺便说一句,我在使用 [17, 17, 17] 匹配维度时得到相同的结果。
编辑:只是为了避免一些混淆。预期结果是 [[1, 17, 3], [4, 17, 6], [7, 17, 9]].
你在找这个吗?:
x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
y=[[l[0],17,l[2]] for l in x]
print(y)
结果是:
[[1, 17, 3], [4, 17, 6], [7, 17, 9]]
x[:]
创建原始列表的副本,并在适当位置修改新列表。
但是,这个创建的列表是不可访问的(因为没有对它的引用)。
如果您想将第二个子列表作为 [17,17,17]
即
x[0] = [17 for _ in x[0]]
但如果您希望它只是 [17]
,那么
x[0] = [17]
编辑:好的,看来我有点误解了这个问题,看来你想 将其视为一种矩阵。对于常规 python 列表和嵌套列表,没有这样的语法糖,您必须创建一个 for 循环:
for sublist in x:
sublist[1] = 17
对于列表理解,您需要创建一个副本,而这在 IMO 中是不需要的。但如果你想要那个
copied_and_modified_x = [[sublist[0], 17, sublist[2]] for sublist in x]
id(x)
和id(x[:])
不同,因为x[:]
创建了x
的浅拷贝。所以,当你写
x[:][0][1] = 17
您正在创建 x
的新浅表副本,并将第一个子列表的第一个元素修改为 17。但是,新结果 result 没有引用,因此无法访问它的内容.
您可以这样做以获得您想要的结果:
a = x[:] # creates a shallow copy of x
a[0][1] = 17
print(x, id(x))
print(a, id(a))
输出:
[[1, 17, 3], [4, 5, 6], [7, 8, 9]] 139933444652552
[[1, 17, 3], [4, 5, 6], [7, 8, 9]] 139933416357064
如果您想要的结果是
,则没有理由使用列表切片x = [[1, 2, 3], [17, 17, 17], [7, 8, 9]]
你应该这样做:
x[1] = [17,17,17]
当您使用切片时,它会创建一个等于 x 的新对象,因此它不会保存在 x 变量上。
list1 = [[1,2,3], [4,5,6], [7,8,9]]
x, y = len(list1)-1, 0
while y <= x:
print(list1[y][1], end=" ")
y = y+1
输出:
2 5 8
我想这对你有帮助