问题:
我有两个长篇清单,每个约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
由于
答案 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
注意:正如您所看到的,不需要使用索引也不需要在每次迭代时查找列表中的零元素