[英]Elegant way to filter two related lists
我有一个简单的for
循环。 这是MWE:
a = [0.6767, -0.0386, 0.6767, 0.4621, 0.6052, 0.3906, 0.6052, 0.3906, 0.6052, 0.4621, 0.6052, 0.4621, 0.5337]
b = [3.6212, 1.5415, 3.4871, 1.8889, 3.3709, 2.078, 3.3012, 2.2236, 3.2265, 2.369, 3.1273, 2.522, 3.0076]
low_lim, high_lim = 0.5, 0.7
c, d = [], []
for indx,i in enumerate(a):
if low_lim <= i <= high_lim:
c.append(i)
d.append(b[indx])
因此,此for
循环所做的基本上是检查a
的项目是否在某个范围内,如果是,则将其存储在c
,并将相应的b
元素(即具有相同索引的元素)存储在d
。
如何更简洁/简洁地编写最后一个代码块?
numpy是您的朋友在这里:)
import numpy as np
a = np.array([0.6767, -0.0386, 0.6767, 0.4621, 0.6052, 0.3906, 0.6052, 0.3906, 0.6052, 0.4621, 0.6052, 0.4621, 0.5337])
b = np.array([3.6212, 1.5415, 3.4871, 1.8889, 3.3709, 2.078, 3.3012, 2.2236, 3.2265, 2.369, 3.1273, 2.522, 3.0076])
low_lim, high_lim = 0.5, 0.7
mask = (low_lim <= a) & (a <= high_lim)
c = a[mask]
d = b[mask]
cd = np.array([a[mask], b[mask]])
#now if you want a one dimensional array, flatten it.
cd = cd.flatten()
使用zip
配对和取消配对列表:
c,d = zip(*[(ia,ib) for (ia, ib) in zip(a,b) if low_lim <= ia <= high_lim])
此处需要splat运算符*
。 可以生成一个生成器表达式,但是为了便于阅读,我在这里使用了列表理解。
但是,与Marcin的答案非常相似,它使用索引。 如果您需要为不止两个数组执行此操作,则enumerate(a)
可能比使用zip(a,b,c,d,..)
更为有效:
c,d = zip(*((a[i],b[i]) for i, x in enumerate(a) if low_lim <= x <= high_lim))
for i, j in itertools.izip(a, b):
if low_lim <= i <= high_lim:
c.append(i)
d.append(j)
使用zip执行完全相同的操作:
c, d = [], []
for a_elem, b_elem in zip(a, b):
if low_lim <= a_elem <= high_lim:
c.append(a_elem)
d.append(b_elem)
如果可以创建一个元组列表而不是两个列表,那么
cd = [(a_elem, b_elem)
for a_elem, b_elem in zip(a,b)
if low_lim <= a_elem <= high_lim]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.