53

私はPythonitertoolsを使用しており、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)

または、それを実行して、1 ステップで長さを取得します。

length = len(list(clusterList))

リストを作成するためにメモリを消費したくない場合は、代わりに次のようにすることができます。

length = sum(1 for x in clusterList)

元の反復子は、リストに変換するか、sum()式を使用することによって完全に消費されることに注意してください。

于 2012-12-14T00:35:44.430 に答える
3

clusterListですiterableが、そうではありませんlist。これは時々少し混乱することがあります。forループオーバーはできますが、clusterList他のリスト操作 (slice、len など) を実行することはできません。

list(clusterList)修正: の結果をに割り当てclusterListます。

于 2012-12-14T00:36:36.583 に答える