python - 如何根据另一个列表中的阈值对一个列表中的值进行分类?
问题描述
我想根据另一个列表中的阈值对一个列表中的值进行分类。换句话说,我想将列表项与列表中的阈值一一进行比较,并获得类别的输出列表。
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 的大小是O(mn)Threshold
。更有效的算法是Threshold
对每个值进行二进制搜索
因此,您可能希望实现自己的函数来替换next()
上述内容,以解决上述两点。
推荐阅读
- go - 如何使用 GORM 初始化具有外键约束的结构并将其插入到数据库中
- javascript - 如何检查动态元素是否可用/已加载?
- angularjs - angular-translate - 同一个翻译键中的变量和插值
- c# - Winform 字体在已部署机器上运行时更改
- java - Elastic Stack - 带有完整 JSON 请求和响应的 REST API 日志记录
- python - 从另一个 Python 脚本运行 Python 脚本时处理异常
- loopbackjs - 用户模型在 loopback3 中给出电子邮件验证错误
- docker - 容器中进程的虚拟内存含义
- c# - 输入字符串的格式不正确 - 插入数据库
- ruby-on-rails - 使用 Rubocop 重构 Rails 应用程序的最佳方法