在列表推导中使用groupby()和filter

时间:2016-07-21 11:33:25

标签: python grouping list-comprehension

为什么会这样?

>>> [ ( { k: len(list(g)) } ) for k, g in groupby(sorted('ABABAABBAC')) ]
[{'A': 5}, {'B': 4}, {'C': 1}]

>>> [ ( { k: len(list(g)) } ) for k, g in groupby(sorted('ABABAABBAC')) if len(list(g)) > 1 ]
[{'A': 0}, {'B': 0}]

它正确过滤掉C,但为什么值为0而不是45?这毫无意义。

(找到一个有效的解决方案是微不足道的,但我想了解这里发生了什么)。

1 个答案:

答案 0 :(得分:3)

当您在 if语句中调用len(list(g))时已经使用了迭代器,因此您的len(list(g))返回0,因为没有任何内容可以迭代。

In [1]: it = iter([1,2,3])

In [2]: list(it)   # call list once consumes
Out[2]: [1, 2, 3]

In [3]: list(it) # nothing left on second call
Out[3]: []

所以len([])正如您所期望的那样返回0