在Python中基于另一个列表的条件访问一个列表

3

我希望能够根据另一个列表中的条件来访问一个列表中的元素。通常,我会使用NumPy来实现这一点,但是我的要求是必须使用Python标准库。以下是我的问题示例:

x = [1, 7, 11, 8, 13, 2]
y = [0,3,0,5,2]
#NumPy notation
z = x[y==0]

我使用列表推导式想出了一个解决方案:
z = [x[i] for i in xrange(len(y)) if y[i] == 0]

然而,与我在 NumPy 中的实现相比,它的速度要慢得多。有没有更好的方法来解决这个问题?

编辑:我没有提到,但我的要求包括使用 Python 2。


1
使用标准的Python库,你不会得到更加高效的解决方案。 - Padraic Cunningham
2个回答

2
您可以使用zip()将项目组合在一起:
try:
    # iterator zip from Python 3
    from future_builtins import zip
except ImportError:
    # this *is* Python 3
    pass

z = [xval for xval, yval in zip(x, y) if yval == 0]

这还可以避免在使用Python 2时为zip()构建列表。

你应该使用 if yval==0 而不是 y==0 - Bruce

0

我个人会使用迭代器zip(如果一个列表较短,它将更快)

这样我就避免了对元素的双重访问,并且如果一个列表比另一个短,我就不会出现异常(你应该在xrange(min(len(x),len(y)))中使用)

[a for (a,b) in zip(x,y) if b==0]

请注意,zip是Python 3的迭代器,而不是Python 2的。
尽管如此,我还没有进行基准测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接