【问题标题】:remove an item from a list in a matrix从矩阵中的列表中删除一个项目
【发布时间】:2020-10-12 06:02:29
【问题描述】:

我有一个问题。我正在尝试从矩阵内的列表中删除一个项目,但是当我尝试从特定列表(例如矩阵 [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]

请帮帮我!

【问题讨论】:

  • 输入是什么,预期输出是什么?
  • 不,它没有。它删除行 [0, 2, 4] 中的第一项。
  • 请详细解释给定的输入和预期输出。
  • 输入在这里,它应该删除行 [0, 2, 4] 中的第一项,但它没有。它对每一行都这样做。
  • 如果您也添加代码来创建此矩阵,将会很有帮助。

标签: python list matrix indexing del


【解决方案1】:

您可以使用列表切片将矩阵中的行设置为原始行的切片减去第一个元素,而不是使用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)]

【讨论】:

    【解决方案2】:

    发生这种情况是因为您没有创建列表的浅表副本。 我不知道 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 个元素。

    【讨论】:

      最近更新 更多