53

我正在使用 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:

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

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

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

4

3 回答 3

72

仅仅因为您调用它clusterList并不会使其成为列表!它基本上是一个惰性迭代器,根据需要返回每个项目。不过,您可以将其转换为这样的列表:

clusterList = list(clusterList)

或者这样做并一步获得它的长度:

length = len(list(clusterList))

如果您不想占用使其成为列表的内存,则可以这样做:

length = sum(1 for x in clusterList)

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

于 2012-12-14T00:35:44.430 回答
3

clusterListiterable但它不是一个list。有时这可能有点令人困惑。你可以做一个for循环,clusterList但你不能在它上面做其他列表的事情(slice、len 等)。

修复:将结果分配list(clusterList)clusterList.

于 2012-12-14T00:36:36.583 回答
0

您可以为此使用基数包。方法count()计算产生的项目数iterable

基数:确定并检查任何可迭代对象的大小

以下代码为您提供了clusterList

import cardinality
cardinality.count(clusterList)
于 2021-03-01T08:16:42.050 回答