2017-04-24 203 views
0

所以这是一个更大的数据集的一部分,但我在这里简化了它。假设您有以下代码。我想要做的是提取子数组,基于什么是中间元素(这就是dataStore的用途)。侧面说明,我知道名单的可变性,并且当我做德尔行[1],我永远会影响数据使用删除删除2D列表中的元素的问题

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)]时,它会将所有东西都移动一次,但是行仍然在前进。所以我想到的是第二个镜像列表的解决方案,但我无法弄清楚它的语法

回答

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]]

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

+0

这是我最终选择,但我最终拼接连续两次因为原来的问题将具有可变大小的方法 – Excal

0

你的感觉是正确的。作为一个经验法则,如果你正在迭代它,你绝不应该修改列表。

如果我正确理解你的问题,你的代码的最终结果就是你应该在DataStore中有一个数组,这个数组中的每个元素都被中间元素排序,中间元素被删除。如果是这样的话,那么我会尝试的东西有点像这么简单:

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