1. ホーム
  2. python

[解決済み】itertools.groupby()を使うにはどうしたらいいですか?)

2022-01-29 02:35:09

質問

実際にPythonの itertools.groupby() 関数を使用します。 私がやろうとしているのは、こういうことです。

  • リスト(この場合、オブジェクト化された lxml 要素
  • 何らかの基準でグループに分ける
  • そして、後でこれらのグループのそれぞれを別々に反復処理します。

見直したのは ドキュメント しかし、単純な数字の羅列以上のものを適用しようとすると、なかなかうまくいかない。

では、どのように itertools.groupby() ? また、他に使うべきテクニックはありますか? また、良い参考文献の紹介もお願いします。

どのように解決するのですか?

重要な注意事項 をしなければなりません。 データのソート を最初に設定します。


私が理解できなかった部分は、例の構造において

groups = []
uniquekeys = []
for k, g in groupby(data, keyfunc):
   groups.append(list(g))    # Store group iterator as a list
   uniquekeys.append(k)

k は現在のグループ化キー、そして g はイテレータで、そのグループ化キーで定義されたグループに対して反復処理を行うために使用します。言い換えれば groupby イテレータ自体はイテレータを返します。

ここでは、より明確な変数名を使った例を紹介します。

from itertools import groupby

things = [("animal", "bear"), ("animal", "duck"), ("plant", "cactus"), ("vehicle", "speed boat"), ("vehicle", "school bus")]

for key, group in groupby(things, lambda x: x[0]):
    for thing in group:
        print("A %s is a %s." % (thing[1], key))
    print("")
    

これで出力されます。

熊は動物である。
アヒルは動物です。

サボテンは植物である。

スピードボートは乗り物です。
スクールバスは乗り物です。

この例では things はタプルのリストで、各タプルの最初の項目は、2番目の項目が属するグループです。

groupby() 関数は2つの引数を取ります。(1)グループ化するデータ、(2)グループ化する関数。

ここで lambda x: x[0] 伝える groupby() は、各タプルの最初の項目をグループ化のキーとして使用します。

上記の for ステートメントを使用します。 groupby は、3つの (キー, グループイテレータ) ペア (一意のキーごとに1回) を返します。返されたイテレータを使って、そのグループ内の個々の項目を反復処理することができます。

同じデータで、リスト内包を使った少し変わった例を紹介します。

for key, group in groupby(things, lambda x: x[0]):
    listOfThings = " and ".join([thing[1] for thing in group])
    print(key + "s:  " + listOfThings + ".")

これで出力されます。

動物:クマ、アヒル
植物:サボテン
乗り物:スピードボート、スクールバス