python - 如何根据另一个列表中的阈值对一个列表中的值进行分类?

标签 python list sorting list-comprehension

我想根据另一个列表中的阈值对一个列表中的值进行分类。换句话说,我想将列表项一个一个地与列表中的阈值进行比较 - 一个一个地获得类别的输出列表。

input:
Values = [9999, 3000, 400, 9999, 1000] - it is variably long due to input data
Threshold = [10000, 5000, 1500, 800, 0] - also will be changed, so have to be variable - but always sorted descending to 0

Expected output (categories' numbers should be based on index):
cat = [0,1,3,0,2]

我相信它可以通过我不太熟悉的高级列表理解来完成。所以我试过了:

val_cat = []
thres_len = len(Threshold)
for item in Values:
     for vis in range(0,thres_len - 1):
          if Threshold[vis+1] < int(item) <= Threshold[vis]:
             val_cat = val_cat + [vis]
          else:
             pass

这种方式既不是 pythonic 的也不是功能性的,但我能尝试的最好的方式是几年前我只学习 VB 的基础知识。

感谢您的帮助!我相信这对这个社区来说是小菜一碟:-)

最佳答案

如果你真的想让它成为一个列表推导式,那么你去吧:

cat = [next(i-1 for i,t in enumerate(Threshold) if t <= v) for v in Values]

但你会期望这样:

  • 最后一个阈值 Threshold[-1] 必须小于 Values 中的所有值(即绝对下限)
  • 这并不快:对于 m Values 的大小和 n Threshold 的大小,O(mn)。一种更有效的算法是对每个值的 Threshold 进行二进制搜索

因此,您可能想实现自己的函数来替换上面的next(),以解决以上两点。

关于python - 如何根据另一个列表中的阈值对一个列表中的值进行分类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55538998/

相关文章:

python - 在 Python 与 Matlab 中减去 3D numpy 数组

python - Python 中的循环效率

Python递归错误,但没有使用递归

python - Flask-MongoEngine & PyMongo 聚合查询

c# - 计算一个项目在列表中出现的次数 C#

java - 有效的 Java 项目 17 : How can overriding removeRange() improve performance?

R 对列表进行排序

java - 在 JSTL 中显示列表元素 <c :/forEach> with counter variable

javascript - 将 x 和 y 值插入数组变量

c++如何按每行列中的值对二维 vector 的行进行排序