Python 将列表列表缩减为字典,子列表大小作为键,发生次数作为值

Python 将列表列表缩减为字典,子列表大小作为键,发生次数作为值,python,dictionary,lambda,reduce,Python,Dictionary,Lambda,Reduce,我有一个列表列表,我想计算具有特定大小的子列表出现的次数 对于列表[[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(

我有一个列表列表,我想计算具有特定大小的子列表出现的次数

对于列表[[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, {}))
您也可以使用以下方法进行此操作:

list_of_list = [[1], [1,2], [1,2], [1,2,3]]
c = Counter(len(i) for i in list_of_list)
输出:

Counter({2: 2, 1: 1, 3: 1})
您也可以使用以下方法进行此操作:

list_of_list = [[1], [1,2], [1,2], [1,2,3]]
c = Counter(len(i) for i in list_of_list)
输出:

Counter({2: 2, 1: 1, 3: 1})

在可以使用集合的情况下,以如此复杂的方式使用reduce不是一个好主意。请以一种更具python风格的方式使用map函数进行计数器:

>>> A = [[1], [1,2], [1,2], [1,2,3]]
>>> from collections import Counter
>>> 
>>> Counter(map(len,A))
Counter({2: 2, 1: 1, 3: 1})
请注意,使用map将比生成器表达式的性能稍好一些,因为通过将生成器表达式传递给计数器python,将自己从生成器函数获取值,因为使用内置函数map在执行时间1方面具有更高的性能

发件人:

生成器表达式的语义相当于创建匿名生成器函数并调用它。例如:

g = (x**2 for x in range(10))
print g.next()
相当于:

def __gen(exp):
    for x in exp:
        yield x**2
g = __gen(iter(range(10)))
print g.next()
请注意,由于生成器表达式在内存使用方面更好,如果您处理的是大数据,最好使用生成器表达式而不是映射函数。

在可以使用集合的情况下,以如此复杂的方式使用reduce不是一个好主意。使用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})
请注意,使用map将比生成器表达式的性能稍好一些,因为通过将生成器表达式传递给计数器python,将自己从生成器函数获取值,因为使用内置函数map在执行时间1方面具有更高的性能

发件人:

生成器表达式的语义相当于创建匿名生成器函数并调用它。例如:

g = (x**2 for x in range(10))
print g.next()
相当于:

def __gen(exp):
    for x in exp:
        yield x**2
g = __gen(iter(range(10)))
print g.next()
请注意,由于生成器表达式在内存使用方面更好,如果您处理的是大数据,最好使用生成器表达式而不是映射函数。

对于这项工作来说,reduce是一个较差的工具

相反,请看一张照片。它是一个dict子类,所以您应该能够在计划使用dict时使用它

>>> from collections import Counter
>>> L = [[1], [1, 2], [1, 2], [1, 2, 3]]
>>> Counter(len(x) for x in L)
Counter({1: 1, 2: 2, 3: 1})
对于这项工作来说,reduce是一种低级工具

相反,请看一张照片。它是一个dict子类,所以您应该能够在计划使用dict时使用它

>>> from collections import Counter
>>> L = [[1], [1, 2], [1, 2], [1, 2, 3]]
>>> Counter(len(x) for x in L)
Counter({1: 1, 2: 2, 3: 1})

挑剔:您不需要计数器构造函数中的中间列表,它可以接受生成器表达式:c=Counterleni for i in list\u of_list。挑剔:您不需要计数器构造函数中的中间列表,它可以接受生成器表达式:c=Counterleni for i in list_of_list。这不起作用的原因是您正在lambda中赋值。在python中,赋值语句不能在lambda中使用。这不起作用的原因是您正在lambda中赋值。在python中,不能在lambda中使用赋值语句。