我正在尝试过滤我正在使用的一些数据,以便在我的测量设备中取出一些伪像,例如负数和错误.我一直在玩使用发电机这样做的想法.我使用的是Python 2.7.2
testlist = [12,2,1,1,1,0,-3,-3,-1]
gen = (i for i, x in enumerate(testlist) if x < 0 or x > 2.5)
for i in gen: testlist.pop(i)
print testlist
Run Code Online (Sandbox Code Playgroud)
返回:
[2, 1, 1, 1, 0, -3]
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么-3值出现在更新的"测试列表"中?
从列表中删除项目后,项目的索引会发生变化(它们全部向下移动一个).结果,生成器将跳过一些项目.尝试添加一些打印语句,以便您可以看到发生了什么:
for i in gen:
print i
print testlist
testlist.pop(i)
Run Code Online (Sandbox Code Playgroud)
输出:
0
[12, 2, 1, 1, 1, 0, -3, -3, -1]
5
[2, 1, 1, 1, 0, -3, -3, -1]
6
[2, 1, 1, 1, 0, -3, -1]
Run Code Online (Sandbox Code Playgroud)
您可能需要删除索引0,5,5,5处的项目.生成器生成索引0,5,6.这是有道理的,因为enumerate返回0, 1, 2, ...等.它不会连续两次返回相同的索引.
一次删除一个元素也是非常低效的.这需要多次移动数据,最坏情况下的性能为O(n 2).您可以改为使用列表推导.
testlist = [x for x in testlist if 0 <= x <= 2.5]
Run Code Online (Sandbox Code Playgroud)