私は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
_で利用可能な操作を調べましたが、グループの長さを提供していると思われるものは見つかりません。
clusterList
と呼ぶからといって、それをリストにしません!これは基本的に遅延イテレータであり、必要に応じて各アイテムを返します。ただし、次のようなリストに変換できます。
_clusterList = list(clusterList)
_
または、それを実行してその長さを1ステップで取得します。
_length = len(list(clusterList))
_
リストを作成するメモリを使いたくない場合は、代わりにこれを行うことができます:
_length = sum(1 for x in clusterList)
_
元のイテレータは、リストに変換するか、sum()
フォーミュレーションを使用することで完全に消費されることに注意してください。
clusterList
はiterable
ですが、list
ではありません。これは時々少し混乱する場合があります。 for
に対してclusterList
ループを実行できますが、その上で他のリスト(slice、lenなど)を実行することはできません。
修正:list(clusterList)
の結果をclusterList
に割り当てます。