3

Pythonでフラットなリストからインデックス付きリストを頻繁に作成しています。これは非常に一般的なタスクであるため、使用する必要のある標準のユーティリティがあるかどうか疑問に思いました。

コンテキストは次のとおりです。配列が与えられた場合、グループ化のためにいくつかのキーを使用して、より小さな配列のdictを作成する必要があります。

例:
["Andy","Alice","Bob","Beth","Charlie"]になります
{"A":["Andy","Alice"],"B":["Bob","Beth"],"C":["Charlie"]}

私の解決策は次のようになります。

def make_index(data,key,value=lambda x:x):
    d={}
    for item in data:
        k = key(item)
        v = value(item)
        try: d[k].append(v)
        except KeyError: d[k]=[v]
    return d

それは単純ですべてですが、他の場所でより適切に実装されているものを再発明していますか?

4

2 に答える 2

5

:を使用すると、同じことをもう少し簡単に行うことができますdefaultdict

from collections import defaultdict

def make_index(data,key,value=lambda x:x):
    d=defaultdict(list)
    for item in data:
        d[key(item)].append(value(item))
    return d

aを使用すると、他のオプションであるを使用するdefaultdictよりも高速.setdefault()になります。

于 2012-09-28T20:09:31.460 に答える
3

答えが削除された理由はわかりませんitertoolsが、私は自分で答えを書いていました。

from itertools import groupby
def make_index(data, key = lambda x: x[0]):
    return {key: list(gr) for key, gr in 
        groupby(sorted(data, key=key), key=key)}

In [3]: make_index(["Andy","Alice","Bob","Beth","Charlie"])
Out[3]: {'A': ['Andy', 'Alice'], 'B': ['Bob', 'Beth'], 'C': ['Charlie']}

In [4]: make_index(["Andy","Alice","Bob","Beth","Charlie"], key=lambda x: len(x))
Out[4]: {3: ['Bob'], 4: ['Andy', 'Beth'], 5: ['Alice'], 7: ['Charlie']}
于 2012-09-28T20:13:34.530 に答える