为什么会这样?
>>> [ ( { 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
而不是4
和5
?这毫无意义。
(找到一个有效的解决方案是微不足道的,但我想了解这里发生了什么)。
答案 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