Python 在列表理解中使用groupby()和过滤器

Python 在列表理解中使用groupby()和过滤器,python,grouping,list-comprehension,Python,Grouping,List Comprehension,为什么会这样 >>> [ ( { k: len(list(g)) } ) for k, g in groupby(sorted('ABABAABBAC')) ] [{'A': 5}, {'B': 4}, {'C': 1}] 但是 它正确地过滤出C,但是为什么值0s而不是4和5?这毫无意义 (找到一个有效的解决方案很简单,但我想了解这里发生了什么)。当您在if语句中调用len(list(g))时,您已经使用了迭代器,因此len(list(g))返回0,因为没有剩余的迭代 In

为什么会这样

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

它正确地过滤出
C
,但是为什么值
0
s而不是
4
5
?这毫无意义


(找到一个有效的解决方案很简单,但我想了解这里发生了什么)。

当您在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

为什么python不返回一个
名称“g”没有定义?第二次调用变量的值是多少?@Ev.Kounis,它确实存在,如上所述,因为您已消费内容并不意味着对象本身已被移除。我不知道正在消费的东西的概念。谢谢@Kounis,不用担心,g不是一个完全的迭代器,它是一个grouper对象,但是对于所有意图和目的来说,逻辑都是完全相同的。
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]: []