首页 > 解决方案 > 如何根据另一个列表中的阈值对一个列表中的值进行分类?

问题描述

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

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的基础知识。

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

标签: pythonlistsortinglist-comprehension

解决方案


如果你真的想让它成为一个列表理解,那么你去:

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

但是你会期望这样:

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

因此,您可能希望实现自己的函数来替换next()上述内容,以解决上述两点。


推荐阅读