我想根据另一个列表中的阈值对一个列表中的值进行分类。换句话说,我想将列表项一个一个地与列表中的阈值进行比较 - 一个一个地获得类别的输出列表。
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
的大小和 nThreshold
的大小,O(mn)。一种更有效的算法是对每个值的Threshold
进行二进制搜索
因此,您可能想实现自己的函数来替换上面的next()
,以解决以上两点。
关于python - 如何根据另一个列表中的阈值对一个列表中的值进行分类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55538998/