0

我有许多通过读取 CSV 创建的列表,其中每个索引代表一个数据点。所以:

# names = ['name1','name2', 'name3', 'name4']
# data1 = ['1', '2', '3', '4']
# data2 = ['a', 'b', 'c', 'd']

相当于:

名称1,1,a

我需要删除某些数据点,最简单的方法似乎是通过索引:

del names[1]
del data1[1]
del data2[1]
# names = ['name1', 'name3', 'name4']

但是,我正在使用索引对列表进行迭代,并且在循环完成之前不想更改它们。我的解决方案是将要删除的项目替换为唯一的字符串,然后再将其删除:

names[1] = 'DELETEME'
data1[1] = 'DELETEME'
data2[1] = 'DELETEME'
# names = ['name1','DELETEME', 'name3', 'name4']

这是一种合理的做法还是我应该做其他事情?

编辑哇,感谢所有的回复。我需要一些时间来测试不同的方法。对于那些询问的人,这里有一个额外的代码片段:

# read CSV file. create lists
names = ['name1', 'name2', 'name3', 'name4']
data1 = [1, 32.018, 3, 4]
data2 = [5, -22, 6, 7]

# master list of names to look for
master = ['name2', 'name5']

for i,n in enumerate(names):
    # find intersections with master list, get indices
    # ...
    matches = [1] # index of 'names2'

    # iterate through matches
    for m in matches:
         # specify a criterion for deleting/modifying data points
         # example:
        if data1[m] == 32.018 and data2[m] == -22:
            del names[m]
            del data1[m]
            del data2[m]
        # specify additional criteria using additional if statements
        # ...
4

5 回答 5

1

这是您在迭代时删除条目而不跳过任何条目或使用“已删除令牌”的方式。

i = 0
while i < len(names):
    if CONDITION_FOR_DELETION:
        del names[i]
        del data1[i]
        del data2[i]
    else:
        i += 1
于 2013-03-13T19:53:44.137 回答
1

您可以保留要删除的索引的备忘录,然后在完成其他工作后以相反的顺序应用它们。

delete_memo = []
for i in xrange(len(names)):
    if CONDITION_FOR_DELETION:
        delete_memo.append(i)
delete_memo.reverse()
for i in delete_memo:
    del names[i]
    del data1[i]
    del data2[i]
于 2013-03-13T20:14:34.603 回答
0

这似乎过于复杂,为什么不将键/值散列到 a 中dict,然后随时删除键/值对呢?

>>> tst = {1:3}
>>> del(tst[1])
>>> tst
{}

你当然必须迭代字典(而不用担心索引),但我通常会发现这更容易

于 2013-03-13T19:42:40.573 回答
0

这不是坏习惯,你这样做的方式,但你可以这样迭代:

data = [1, 2, 3, 4, 5]
i = 0
while i < len(data):
    if data[i] == 3:
        del data[i]
    else:
        i += 1

i基本上,只有在您不从列表中删除该项目时才增加计数器。

于 2013-03-13T19:56:19.997 回答
0

根据您的需要,您还可以考虑迭代列表的副本。

如果您发布代码片段的副本,它可能会有所帮助。

于 2013-03-13T20:14:38.513 回答