从其他列表创建列表的简单方法

时间:2015-07-08 21:30:33

标签: python

我有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

有没有人知道是否有更整洁,甚至更有效的方式来执行上述计算?

4 个答案:

答案 0 :(得分:3)

可能是最直截了当的方式:

zip(x, y, z)

我们使用the zip function两次来恢复数据的原始结构。

(t for t in it if t[-1] > 0)创建一个新的迭代器对象,它产生三元组。

t[-1]过滤三元组(valuezip(*(...)))。

xnew正好产生3个元组,而ynewznewif会收到它们。

答案 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))