Python代码阅读(第7篇):列表分组计数

本文介绍了如何使用Python对列表进行分组并计算每组元素数量,探讨了字典推导式和简化代码的方法。通过示例代码展示了如何利用map()和字典来高效实现这一功能,同时对比了不同实现方式的效率差异。

Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码

本篇阅读的代码实现了使用分组函数对列表进行分组,并计算每组的元素个数的功能。

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

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;如果含有,就将value1

使用字典推导式

在** Python代码阅读:根据给定的函数对列表中的元素进行分组**中使用了字典推导式,将列表进行了分组。这里也可以使用同样的方式,在分组之后直接获取列表长度。不过这种写法遍历了两次列表,会使程序效率变低。

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

使用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时,很轻松地将(键-值对组成的)序列转换为(键-列表组成的)字典。因此我们也可以据此改写** Python代码阅读:根据给定的函数对列表中的元素进行分组**中的实现方式,提高效率。

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']}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值