web-dev-qa-db-ja.com

Python:itertools _grouperの長さを取得する方法

私は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_で利用可能な操作を調べましたが、グループの長さを提供していると思われるものは見つかりません。

38
user1466679

clusterListと呼ぶからといって、それをリストにしません!これは基本的に遅延イテレータであり、必要に応じて各アイテムを返します。ただし、次のようなリストに変換できます。

_clusterList = list(clusterList)
_

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

_length = len(list(clusterList))
_

リストを作成するメモリを使いたくない場合は、代わりにこれを行うことができます:

_length = sum(1 for x in clusterList)
_

元のイテレータは、リストに変換するか、sum()フォーミュレーションを使用することで完全に消費されることに注意してください。

49
kindall

clusterListiterableですが、listではありません。これは時々少し混乱する場合があります。 forに対してclusterListループを実行できますが、その上で他のリスト(slice、lenなど)を実行することはできません。

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

3
Brian Cain