从矩阵列表中删除一个项目

时间:2020-06-22 11:27:42

标签: python list matrix indexing del

我有问题。我试图从矩阵内的列表中删除一个项目,但是当我尝试从特定列表(例如matrix [0])中删除该项目时,它将从矩阵内的每个列表中删除该项目。

这是代码:

ap = 95
sp = [125, 150]
ch = 195
sett = []
giorno = []
for matt in range(ap,sp[0]+5,5):
    giorno.append(matt)
for sera in range(sp[1],ch+5,5):
    giorno.append(sera)

for i in range(5):
    sett.append(giorno)

print(sett[1])
for i  in range(0,5,2):
        del sett[i][0]
print(sett[1])

输出:

1st printf(sett[1]):
[95, 100, 105, 110, 115, 120, 125, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195]
2nd printf(sett[1]):
[110, 115, 120, 125, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195]

预期产量

1st printf(sett[1]):
[95, 110, 115, 120, 125, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195]
2nd printf(sett[1]):
[95, 110, 115, 120, 125, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195]

请帮助我!

2 个答案:

答案 0 :(得分:0)

您可以使用列表切片将矩阵中的行设置为原始行的一部分减去第一个元素,而不用使用del删除元素。可以这样做:

for i in range(0,5,2):
    matrix[i] = matrix[i][1:]

print(matrix)

这给出结果

[[100, 105, 110, 115, 120, 125, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195], 
[95, 100, 105, 110, 115, 120, 125, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195], 
[100, 105, 110, 115, 120, 125, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195], 
[95, 100, 105, 110, 115, 120, 125, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195], 
[100, 105, 110, 115, 120, 125, 150, 155, 160, 165, 170, 175, 180, 185, 190, 195]]

因此在第0、2和4行中删除了第一个元素。也可以使用列表理解功能将其缩短为:

matrix = [row[1:] if i % 2 == 0 else row for i, row in enumerate(matrix)]

答案 1 :(得分:0)

之所以会这样,是因为您没有创建列表的浅表副本。 我不知道Python如何共享内存和指针,但是我可以说,如果您在内存中复制giorno列表,而不是直接多次附加它,它应该可以工作。可能是因为Python在编辑单个列表时也会编辑列表的其他引用。

尝试通过重新实例化来浅表复制它:

for i in range(5):
    sett.append(list(giorno))

或以空方式将其切片:

for i in range(5):
    sett.append(giorno[:])

然后它将按预期工作。

此外,如果要从列表中删除前5个元素,则不应循环遍历,因为在循环时会删除元素,并且会删除不正确的元素。 因此,只需删除

del sett[i][0]

,您将按预期删除前5个元素。