将列表列表缩减为字典,子列表大小为键,出现次数为值

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)

Kas*_*mvd 7

它不是用一个好主意,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)

PEP 0289 - 发电机表达:

生成器表达式的语义等同于创建匿名生成器函数并调用它.例如:

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()
Run Code Online (Sandbox Code Playgroud)

请注意,由于生成器表达式在内存使用方面更好,如果要处理大数据,最好使用生成器表达式而不是map函数.