python - 如何按值对python中的列表进行分类?
问题描述
我在python中有一个数据列表:
data=[90,30,13,67,85,87,50,45,51,72,64,69,59,17,22,23,44,25,16,67,85,87,50,45,51,72,59,14,50,55,32,23,24,25,37,28,39,30,33,35,40,34,41,43,94,95,98,99,44,45,47,48,49,53,61,63,69,75,77,60,83]
我正在尝试将数据分类为 10-20、20-30、30-40... 的实例,并计算每个类别中有多少个。我尝试将其拆分为单独的列表,但一旦分开我就无法计算
def split_at_values(lst, values):
indices = [i for i, x in enumerate(lst) if x in values]
for start, end in zip([0, *indices], [*indices, len(lst)]):
yield lst[start:end+1]
values = {19, 29, 39, 49, 59, 69, 79, 89, 99}
print(*split_at_values(data, values))
解决方案
-package 中有一个非常好的Counter
对象collections
。计算每种类型的数量非常好(而且速度很快)。
对于您的问题:如果我们将所有数字除以//10
我们得到每个数字的组。然后我们使用 Counter 来计算每组有多少。
from collections import Counter
Counter( i//10 for i in data )
这给出了:
Counter({9: 5, 3: 8, 1: 4, 6: 8, 8: 5, 5: 9, 4: 11, 7: 4, 2: 7})
这意味着在 90-99 之间有 5 个数字,在 30-39 之间有 8 个数字,依此类推。
但是您可能希望它们排序并更漂亮一些,所以我们可以这样做:
sorted([f"{k}0-{k}9 : {v}" for k,v in Counter( i//10 for i in data ).items()])
这看起来像这样:
sorted([f"{k}0-{k}9 : {v}" for k,v in Counter( i//10 for i in data ).items()])
['10-19 : 4',
'20-29 : 7',
'30-39 : 8',
'40-49 : 11',
'50-59 : 9',
'60-69 : 8',
'70-79 : 4',
'80-89 : 5',
'90-99 : 5']
推荐阅读
- ruby-on-rails - Rails:Rails 如何根据表单提交的输入数据创建参数哈希
- sequelize.js - 如何使用`selectGraphQLResultFromTable` 在后图形解析器中加载 Sequelize 查询的关系?
- arm - STM32F103在KEIL IDE下支持浮点吗
- kentico - 创建自定义同义词列表
- computer-vision - 为我的图像应用多 Otsu 阈值
- pandas - Pandas 适用于 group by 以进行文本连接
- plugins - 将 tt_content 的 TCA 更改为子类型?
- ssl - 套接字 sslerror 握手失败 Python 2.4.3
- php - MAMP 4.2 + CodeIgnter 4.1:无法在 Windows 10 环境下加载 PHP 7.4.1 中的 intl 扩展
- assembly - How to split a 32-bit integer to two 16-bit half-words