从相同索引位置的2个列表中删除多个元素

时间:2015-11-20 12:12:24

标签: python list

问题:

我有两个长篇清单,每个约50,000个元素,大小完全相同。列表a包含8个值(全部不同),后跟16个零,这些零重复到列表的末尾,列表b是在第一个列表上执行的三角函数的结果。

我想从列表a中删除所有零,然后从列表b中删除每个相应的索引。

示例(为简单起见,所有1' s和2')

a = [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2] ...

b = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2] ...

成为

a = [1,1,1,1,1,1,1,1,2,2] ...

b = [1,1,1,1,1,1,1,1,2,2] ...

实际上,除了零之外,每个元素都有不同的值,所以我想到了一个循环,它将列表a扫描为零,并从两个列表中删除该索引处的元素。

这是我到目前为止所提出的问题,但我收到的错误列表索引超出范围'

for i in range(len(a)):
    if a[i] == 0:
        a.remove(a[i])
        b.remove(b[i])
    else:
        pass

由于

4 个答案:

答案 0 :(得分:1)

使用numpy' s fancy indexing,您可以使用几行代码执行此操作:

import numpy as np
a = np.array(a)
b = np.array(b)[a != 0].tolist()
a = a[a != 0].tolist()

如果您正在处理大部分数据,请考虑使用numpy

答案 1 :(得分:0)

这是我认为删除零的更好方法:
sol 1

while a.count(0):
     a.remove(0)

print a #[1,1,1,...,2]

或者你可以这样做: sol2

for i in range(len(a)-1,-1,-1):
      if a[i] == 0:
          a.remove(a[i])
          b.remove(b[i])

你的代码不工作的原因是,当你从零开始然后使用范围(len(a))假设范围是25,那么你删除第4个元素,现在你的范围是24而你的列表不再有第25个元素!因此,当你进行循环时,我会得到索引错误(因为到那时你的列表较小),但是如果你从列表的末尾移动,当你的列表变小时,这个问题就不会发生了< / p>

答案 2 :(得分:0)

a = [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2]
b = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2]
x = zip(a,b)
x = filter(lambda item: item[0] != 0, x)
a,b = map(list,zip(*x))

使用zip组合列表a和b,结果如下:

  

[(1,1),(1,1),(1,1),(1,1),(1,1),(1,1),(1,1),(1,1) ),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1), (0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(0,1),(2) ,2),(2,2)]

然后过滤第一个元素为0的tuple。 最后,解压缩结果并转换为list

在Python 3.0之前,如果您有大量元素,则需要使用itertools.izip。

答案 3 :(得分:0)

一种方法是

a = [1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2]
b = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2]
new_a = []
new_b = []
for i,j in zip(a,b):
    if i:
        new_a.append(i)
        new_b.append(j)
a = new_a
b = new_b
print(a)
print(b)

产生

[1, 1, 1, 1, 1, 1, 1, 1, 2, 2]
[1, 1, 1, 1, 1, 1, 1, 1, 2, 2]

使用相同方法但具有列表推导的另一个(更快)解决方案是

new_a = [i for i in a if i]
b = [j for i,j in zip(a,b) if i]
a = new_a

注意:正如您所看到的,不需要使用索引也不需要在每次迭代时查找列表中的零元素