52

私はpython辞書を持っています

d = {1: 6, 2: 1, 3: 1, 4: 9, 5: 9, 6: 1}

上記の辞書の値は一意ではないためです。一意の値のすべてのキーをリストとしてグループ化し、次のように新しい辞書を作成します。

v = {6:[1], 1:[2, 3, 6], 9: [4, 5]}

新しい辞書vのキーはソートする必要があることに注意してください。この辞書の作成を視覚化して実装するのは難しいと感じています。簡単で効率の良い方法を教えてください。

4

2 に答える 2

80

collections.defaultdict簡単に使用する:

from collections import defaultdict

v = defaultdict(list)

for key, value in sorted(d.items()):
    v[value].append(key)

しかし、次を使用して、ボグ標準でdictも実行できdict.setdefault()ます。

v = {}

for key, value in sorted(d.items()):
    v.setdefault(value, []).append(key)

上記はキーを最初にソートします。後で出力辞書の値をソートするのは、はるかに面倒で非効率的です。

出力をソートする必要がないsorted()場合は、呼び出しを中止してセットを使用できます(入力辞書のキーは一意であることが保証されているため、情報が失われることはありません)。

v = {}

for key, value in d.items():
    v.setdefault(value, set()).add(key)

生産する:

{6: {1}, 1: {2, 3, 6}, 9: {4, 5}}

(セット値の出力がソートされるのは偶然であり、整数のハッシュ値の実装方法の副作用です。セットは順序付けられていない構造です)。

于 2013-04-01T21:12:53.713 に答える
25

dict一日の終わりに が実際に必要ない場合は、次を使用できますitertools.groupby

from itertools import groupby
from operator import itemgetter

for k, v in groupby(sorted(d.items(), key=itemgetter(1)), itemgetter(1)):
    print(k, list(map(itemgetter(0), v)))

もちろん、本当にしたい場合は、これを使用して dict を作成できます。

{
    k: list(map(itemgetter(0), v))
    for k, v in groupby(sorted(d.items(), key=itemgetter(1)), itemgetter(1))
}

しかし、その時点では、Martijn の defaultdict ソリューションを使用したほうがよいでしょう。

于 2013-04-01T21:24:09.040 に答える