Python:如何获得itertools _grouper的长度

use*_*679 39 python group-by python-itertools

我正在使用Python itertools并使用groupby按最后一个元素对一堆对进行排序.我已经把它排序了,我可以很好地遍历组,但我真的很想能够得到每个组的长度,而不必遍历每个组,增加一个计数器.

该项目是集群的一些数据点.我正在使用(numpy.array,int)对,其中numpy数组是一个数据点,整数是一个簇标签

这是我的相关代码:

data = sorted(data, key=lambda (point, cluster):cluster)
for cluster,clusterList in itertools.groupby(data, key=lambda (point, cluster):cluster):
    if len(clusterList) < minLen:
Run Code Online (Sandbox Code Playgroud)

在最后一行:if len(clusterList) < minLen:,我得到一个错误

'itertools._grouper'类型的对象没有len()

我查找了可用的操作_groupers,但找不到任何似乎提供组长度的内容.

kin*_*all 49

仅仅因为你打电话就clusterList不会成为一个清单!它基本上是一个懒惰的迭代器,根据需要返回每个项目.您可以将它转换为这样的列表,但是:

clusterList = list(clusterList)
Run Code Online (Sandbox Code Playgroud)

或者这样做,并一步到位:

length = len(list(clusterList))
Run Code Online (Sandbox Code Playgroud)

如果您不想占用将其作为列表的记忆,您可以这样做:

length = sum(1 for x in clusterList)
Run Code Online (Sandbox Code Playgroud)

请注意,原始迭代器将通过将其转换为列表或使用sum()公式来完全消耗.

  • 这是一个如此优雅的解决方案! (2认同)