共计 1300 个字符,预计需要花费 4 分钟才能阅读完成。
本篇浏览的代码实现了应用分组函数对列表进行分组,并计算每组的元素个数的性能。
本篇浏览的代码片段来自于 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
;如果含有,就将value
加1
。
应用字典推导式
在 ** 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']}
正文完