使用Del删除2D Lis中元素的错误

2024-04-25 15:01:06 发布

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

所以这是一个更大的数据集的一部分,但我在这里简化了它。假设你有以下代码。我要做的是根据中间元素(dataStore就是为了这个)提取子数组。请注意,我知道列表的易变性,当我删除行[1]时,我会永久地影响数据

dataStore = []
data = [[1,3,7], [1,0,1],[2,0,2],[9,0,9], [3,1,9]]
print(data)
for index in range(0, 5):
    temp = []
    for row in data:
        if row[1] == index:
            del row[1]
            temp.append(row)
            del data[ data.index(row)]
    dataStore.append(temp)

输出为: Data: [[2, 0, 2]] DataStore: [[[1, 1], [9, 9]], [[3, 9]], [], [[1, 7]], []]

现在数据应该在我完成之后是空的,这里的错误是(2,0,2)没有被删除,因为它与刚刚被删除的东西背靠背。你怎么避开这个?你知道吗

我是如何处理事情的:我觉得原因是当你做del data[ data.index(row)]的时候,它把所有的东西都上移了一步,但是行仍然在向前迭代。所以我在想第二个镜像列表的解决方案,但是我不知道它的语法


Tags: 数据代码in元素列表fordataindex
2条回答

你的感觉是对的。作为一个经验法则,如果你正在遍历一个列表,你永远不应该修改它。你知道吗

如果我正确地理解了您的问题,那么代码的最终结果是,您应该在数据存储中有一个数组,该数组是数据中的每个元素,按中间元素排序,并删除中间元素。如果是这样的话,我会尝试一些简单的方法,比如:

dataStore = [[x[0],x[1]] for x in sorted(data,key=lambda i: i[1])]
del data

完成后是否需要data数组为空?我不确定,但也许这就是你想要的:

data = [[1,3,7], [1,0,1], [2,0,2], [9,0,9], [3,1,9]]
dataStore = []
for index in range(0, 5):
    for row in data:
        if row[1] == index:
            dataStore.append([row[0], row[2]])
print(dataStore)

所有内容都存储在新的dataStore数组中,而不是删除当前的data数组。如果你在一个数组上迭代,你永远不想在这样做的时候修改它。输出应该是:[[1, 1], [2, 2], [9, 9], [3, 9], [1, 7]]

请注意,这并不是最有效的方法,但除非处理非常大的数据集,否则您不会注意到。你知道吗

相关问题 更多 >