【问题标题】:Python: How to get the length of itertools _grouperPython:如何获取 itertools _grouper 的长度
【发布时间】:2012-12-01 23:58:34
【问题描述】:

我正在使用 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) &lt; minLen:,我收到一个错误

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

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

【问题讨论】:

  • 可能有更好的方法,但您可以将 iterable 转换为列表并计算元素 (if len(list(clusterList)) &lt; minLen:)。
  • 谢谢,RocketDonkey,效果很好!
  • 完全没有问题 - 下面的答案提出了相同的解决方案,因此您可以接受其中一个以使其成为“答案”。祝一切顺利!

标签: python group-by itertools


【解决方案1】:

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

clusterList = list(clusterList)

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

length = len(list(clusterList))

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

length = sum(1 for x in clusterList)

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

【讨论】:

  • 如此优雅的 sum 解决方案!
  • np.bool8(1) (25 Byte) 在我的系统上小于 1 (28 Byte)。
【解决方案2】:

clusterListiterable,但它不是 list。有时这可能有点令人困惑。您可以在 clusterList 上执行 for 循环,但您不能对其执行其他列表操作(切片、len 等)。

修复:将list(clusterList)的结果赋值给clusterList

【讨论】:

    【解决方案3】:

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

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

    下面的代码给你clusterList的长度

    import cardinality
    cardinality.count(clusterList)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多