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]: []