5

これを行うには、Pythonに組み込みが必要だと思います。アイテムのリストを取得し、キーを共通のキーを持つアイテムのリストにマッピングするディクショナリに変換します。

それはとても簡単です:

# using defaultdict
lookup = collections.defaultdict(list)
for item in items:
    lookup[key(item)].append(item)

# or, using plain dict
lookup = {}
for item in items:
    lookup.setdefault(key(item), []).append(item)

しかし、これは十分に頻繁に使用されるため、組み込み関数が適しています。次のように、自分で実装できます。

def grouped(iterable, key):
    result = {}
    for item in iterable:
        result.setdefault(key(item), []).append(item)
    return result

lookup = grouped(items, key)

これはitertools.groupby、いくつかの重要な点で異なります。から同じ結果を得るにはgroupby、これを行う必要がありますが、これは少し醜いです:

lookup = dict((k, list(v)) for k, v in groupby(sorted(items, key=key), key))

いくつかの例:

>>> items = range(10)
>>> grouped(items, lambda x: x % 2)
{0: [0, 2, 4, 6, 8], 1: [1, 3, 5, 7, 9]}

>>> items = 'hello stack overflow how are you'.split()
>>> grouped(items, len)
{8: ['overflow'], 3: ['how', 'are', 'you'], 5: ['hello', 'stack']}

より良い方法はありますか?

4

2 に答える 2

3

私はこの質問をcomp.lang.pythonにも投稿しましたが、コンセンサスは、これは実際には組み込み関数を保証するほど一般的ではないということです。したがって、明白なアプローチを使用するのが最善です。それらは機能し、読み取り可能です。

# using defaultdict
lookup = collections.defaultdict(list)
for item in items:
    lookup[key(item)].append(item)

# or, using plain dict
lookup = {}
for item in items:
    lookup.setdefault(key(item), []).append(item)

質問を削除するつもりでしたが、誰かが情報を探して偶然出くわした場合に備えて、ここに残しておくこともできます.

于 2013-03-23T06:09:01.103 に答える
1

とほぼ同じ API が必要なgroupby場合は、次を使用できます。

def groupby2(iterable, keyfunc):
    lookup = collections.defaultdict(list)
    for item in iterable:
        lookup[keyfunc(item)].append(item)
    return lookup.iteritems()

これは上記の例と同じですが、作成したiteritemsルックアップ テーブルの を返す関数になりました。

于 2013-04-30T21:36:36.290 に答える