Python代码实现列表分组计数

作者:Felix 时间:2022-11-03 07:58:38 

Python代码实现列表分组计数

本篇阅读的代码片段来自于30-seconds-of-python。

1. count_by


def count_by(arr, fn=lambda x: x):
 key = {}
 for el in map(fn, arr):
   key[el] = 1 if el not in key else key[el] + 1
 return key

# EXAMPLES
from math import floor
count_by([6.1, 4.2, 6.3], floor) # {6: 2, 4: 1}
count_by(['one', 'two', 'three'], len) # {3: 2, 5: 1}

count_by根据给定的函数对列表中的元素进行分组,并返回每组中元素的数量。该使用map()使用给定函数映射给定列表的值。在映射上迭代,并在每次出现时增加元素数。

该函数使用not in判断目前字典中是否含有指定的key,如果不含有,就将该key加入字典,并将对应的value设置为1;如果含有,就将value加1。

2. 使用字典推导式

字典推导式有{ key_expr: value_expr for value in collection if condition }这样的形式。group_by函数中字典推导式的value_expr是一个列表,该列表使用了列表推导式来生成。即


{ key_expr: [x for x in collection2 if condition2] for value in collection1 if condition1 }

同时,我们可以看到根据group_by代码中的字典推导式,可能计算出key相同的项,根据Pyrhon中字典的类型的规则,key相同的,只保留最新的key-value对。实际上当key相同时,value值也一样。[el for el in lst if fn(el) == key]推导式的for语句中只有key一个变量。


>>> d = {'one': 1, 'two': 2, 'three': 3, 'two': 2}
>>> d
{'one': 1, 'two': 2, 'three': 3}
>>> d = {'one': 1, 'two': 2, 'three': 3, 'two': 22}
>>> d
{'one': 1, 'two': 22, 'three': 3}
>>>

这里也可以使用同样的方式,在分组之后直接获取列表长度。不过这种写法遍历了两次列表,会使程序效率变低。


def count_by(lst, fn):
 return {key : len([el for el in lst if fn(el) == key]) for key in map(fn, lst)}

3. 使用collections.defaultdict简化代码


class collections.defaultdict([default_factory[, ...]])

collections.defaultdict包含一个default_factory属性,可以用来快速构造指定样式的字典。

当使用int作为default_factory,可以使defaultdict用于计数。因此可以直接使用它来简化代码。相比字典推导式的方法,只需要对列表进行一次循环即可。


from collections import defaultdict

def count_by(lst, fn):
 d = defaultdict(int)
 for el in lst:
   d[fn(el)] += 1
 return d

当使用 list 作为 default_factory时,很轻松地将(键-值对组成的)序列转换为(键-列表组成的)字典。


def group_by(lst, fn):
 d = defaultdict(list)
 for el in lst:
   d[fn(el)].append(el)
 return d

# EXAMPLES
from math import floor
group_by([6.1, 4.2, 6.3], floor) # {4: [4.2], 6: [6.1, 6.3]}
group_by(['one', 'two', 'three'], len) # {3: ['one', 'two'], 5: ['three']}

来源:https://segmentfault.com/a/1190000040668316

标签:Python,列表,分组,计数
0
投稿

猜你喜欢

  • python解包概念及实例

    2022-07-01 11:30:03
  • MySQL中如何优化order by语句

    2024-01-23 09:49:25
  • pandas.read_csv参数详解(小结)

    2022-03-10 21:00:35
  • sqlserver 触发器实例代码

    2012-01-29 18:30:45
  • Mysql5.7忘记root密码及mysql5.7修改root密码的方法

    2024-01-24 16:04:29
  • Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程

    2021-07-07 08:52:17
  • 解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题

    2021-08-09 00:56:29
  • 对Python中创建进程的两种方式以及进程池详解

    2021-05-21 14:37:48
  • javascript运动效果实例总结(放大缩小、滑动淡入、滚动)

    2024-04-16 09:24:46
  • 使用Python来做一个屏幕录制工具的操作代码

    2023-11-02 18:57:40
  • 仿淘宝星级评分效果

    2010-09-03 18:37:00
  • 手把手教你安装Windows版本的Tensorflow

    2021-07-12 07:03:15
  • 详解Node.js读写中文内容文件操作

    2024-05-03 15:55:07
  • 使用python测试prometheus的实现

    2023-08-31 15:24:05
  • JavaScript库jQuery入门简介

    2007-10-17 11:43:00
  • python实现雪花飘落效果实例讲解

    2022-08-29 07:31:55
  • C#连接数据库的方法

    2024-01-21 16:28:40
  • Oracle9i 动态SGA,PGA特性探索

    2009-04-24 12:39:00
  • 计划备份mysql数据库

    2009-03-09 14:34:00
  • golang执行命令操作 exec.Command

    2024-04-26 17:31:20
  • asp之家 网络编程 m.aspxhome.com