Woj*_*hKo 1 python reduce lambda dictionary
我有一个列表列表,我想计算出具有特定大小的子列表的次数.
例如.对于[[1], [1,2], [1,2], [1,2,3]]我希望得到的清单{1: 1, 2: 2, 3: 1}
我试过reduce功能,但我有语法错误,+= 1不知道出了什么问题.
list_of_list = [[1], [1,2], [1,2], [1,2,3]]
result = functools.reduce(lambda dict,list: dict[len(list)] += 1, list_of_list, defaultdict(lambda: 0, {}))
Run Code Online (Sandbox Code Playgroud)
它不是用一个好主意,reduce在时,你可以用这样一个复杂的方式collections.Counter()与map()在更Python单向函数:
>>> A = [[1], [1,2], [1,2], [1,2,3]]
>>> from collections import Counter
>>>
>>> Counter(map(len,A))
Counter({2: 2, 1: 1, 3: 1})
Run Code Online (Sandbox Code Playgroud)
注意,使用map将比生成器表达式稍微好一点,因为通过将生成器表达式传递给Counter()python将自己从生成器函数中获取值,因为使用内置函数map在执行时间1方面具有更高的性能.
~$ python -m timeit --setup "A = [[1], [1,2], [1,2], [1,2,3]];from collections import Counter" "Counter(map(len,A))"
100000 loops, best of 3: 4.7 usec per loop
~$ python -m timeit --setup "A = [[1], [1,2], [1,2], [1,2,3]];from collections import Counter" "Counter(len(x) for x in A)"
100000 loops, best of 3: 4.73 usec per loop
Run Code Online (Sandbox Code Playgroud)
生成器表达式的语义等同于创建匿名生成器函数并调用它.例如:
Run Code Online (Sandbox Code Playgroud)g = (x**2 for x in range(10)) print g.next()相当于:
Run Code Online (Sandbox Code Playgroud)def __gen(exp): for x in exp: yield x**2 g = __gen(iter(range(10))) print g.next()
请注意,由于生成器表达式在内存使用方面更好,如果要处理大数据,最好使用生成器表达式而不是map函数.