本文阅读的代码使用分组函数实现了对列表进行分组的功能,计算每组的元素个数。本文阅读的代码片段来自30-seconds-of-python。count_bydefcount_by(arr,fn=lambdax:x):key={}forelinmap(fn,arr):key[el]=1ifelnotinkeyelsekey[el]+1returnkey#EXAMPLESfrommathimportfloorcount_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()使用给定函数映射给定列表的值。遍历地图,增加每次出现的元素数量。该函数使用notin判断当前字典中是否包含指定的key。如果不是,则将key添加到字典中,并将对应的value设置为1;如果存在,则将值加1。使用字典推导式在**Python代码阅读:根据给定函数对列表中的元素进行分组**中,使用字典推导式对列表进行分组。这里也可以用同样的方法,分组后直接获取列表的长度。但是这种写法会遍历链表两次,会降低程序的效率。defcount_by(lst,fn):return{key:len([elforelinlstiffn(el)==key])forkeyinmap(fn,lst)}使用collections.defaultdict简化代码类集合。defaultdict([default_factory[,...]])collections.defaultdict包含一个default_factory属性,可以用来快速构造指定样式的字典。当使用int作为default_factory时,可以使defaultdict进行计数。所以可以直接使用,简化代码。与字典理解法相比,只需要列表的一个循环。fromcollectionsimportdefaultdictdefcount_by(lst,fn):d=defaultdict(int)forelinlst:d[fn(el)]+=1returnd当使用list作为default_factory时,很容易转换(键值对)序列到一个(key-list)字典中。因此,我们也可以重写**Python代码阅读:按照给定函数对列表中的元素进行分组**中的实现方法,以提高效率。defgroup_by(lst,fn):d=defaultdict(list)forelinlst:d[fn(el)]。append(el)returnd#EXAMPLESfrommathimportfloorgroup_by([6.1,4.2,6.3],floor)#{4:[4.2],6:[6.1,6.3]}group_by(['一个','两个','三'],len)#{3:['一','二'],5:['三']}
