首页 > 解决方案 > 如何按值对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))

标签: pythonlist

解决方案


-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']

推荐阅读