我有3个列表:x,y和z。所有都是相同的大小,但我需要创建新的x,y和z列表,具体取决于z的每个索引的值,如下所示:
xNew = []
yNew = []
zNew = []
i = 0
for value in z:
if value > 0:
xNew.append(x[i])
yNew.append(y[i])
zNew.append(z[i])
i += 1
有没有人知道是否有更整洁,甚至更有效的方式来执行上述计算?
答案 0 :(得分:3)
可能是最直截了当的方式:
zip(x, y, z)
我们使用the zip
function两次来恢复数据的原始结构。
(t for t in it if t[-1] > 0)
创建一个新的迭代器对象,它产生三元组。
t[-1]
过滤三元组(value
是zip(*(...))
)。
xnew
正好产生3个元组,而ynew
,znew
和if
会收到它们。
答案 1 :(得分:1)
效率不高但有点整洁:
for (_x,_y,_z) in zip(x,y,z):
if _z > 0:
l.append((_x, _y,_z))
x,y,z = map(list, zip(*l))
print(x,y,z)
对于使用itemgetter的其他方法:
from operator import itemgetter
inds = [ind for ind, value in enumerate(z)if value > 0]
x,y,z = (list(itemgetter(*inds)(l)) for l in (x,y,z))
print(x,y,z)
答案 2 :(得分:0)
将列表推导(用作过滤器)与enumerate()
结合使用:
>>> z=[1,1,-1,1,1,-1]
>>> x=[1,2,3,4,5,6]
>>> xNew=[x[i] for i,zi in enumerate(z) if zi>0]
>>> xNew
[1, 2, 4, 5]
或者zip()
更美丽:
>>> xNew=[xi for xi,zi in zip(x,z) if zi>0]
>>> xNew
[1, 2, 4, 5]
答案 3 :(得分:0)
这有点复杂,因为你有几个列表,需要根据其中一个列表中的值跳过所有列表中的值。我认为,这是使用zip
和列表推导的最佳方式:
xNew, yNew, zNew = zip(*(xyz for xyz in zip(x, y, z) if xyz[2] > 0))