繁体   English   中英

筛选两个相关列表的优雅方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM