私は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)
しかし、これは組み込み関数がいいだろうというユースケースを十分に頻繁です。私のような、それを自分自身を実現することができます。これは、いくつかの重要な点でitertools.groupby
と異なる
def grouped(iterable, key):
result = {}
for item in iterable:
result.setdefault(key(item), []).append(item)
return result
lookup = grouped(items, key)
。 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']}
良い方法はありますか?
「これは十分な使用例が多い」ということはわかりません。私はそれをほとんど使用せず、必要なときに 'defaultdict'を使うだけで完璧です。 AFAIKには、あなたが望むものだけを内蔵しているものはありません。 – Bakuriu
あなたはおそらく正しいでしょうが、私の一部はこれがgroupbyとしての組み込みのものと同様に考えています。 – FogleBird