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

时间:2017-04-24 16:02:42

标签: python

所以这是更大的数据集的一部分,但我在这里简化了它。说你有以下代码。我要做的是根据中间元素提取子数组(这就是dataStore的用途)。旁注,我知道列表可变性,当我做del row [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)]时,它会将所有内容向上移动,但行仍在向前迭代。所以我在考虑第二个镜像列表的解决方案,但我无法弄清楚它的语法

2 个答案:

答案 0 :(得分:0)

当你完成时,你需要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]]

请注意,这不是最有效的方法,但除非您使用非常大的数据集,否则您不会注意到。

答案 1 :(得分:0)

你的感受是正确的。根据经验,如果您正在迭代它,则不应修改列表。

如果我正确理解你的问题,你的代码的最终结果是你应该在DataStore中有一个数组,它是由中间元素排序的数据中的每个元素,中间元素被删除。如果是这种情况,那么我会尝试一些更简单的事情:

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