私は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のキーはソートする必要があることに注意してください。この辞書の作成を視覚化して実装するのは難しいと感じています。簡単で効率の良い方法を教えてください。
私は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のキーはソートする必要があることに注意してください。この辞書の作成を視覚化して実装するのは難しいと感じています。簡単で効率の良い方法を教えてください。
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}}
(セット値の出力がソートされるのは偶然であり、整数のハッシュ値の実装方法の副作用です。セットは順序付けられていない構造です)。
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 ソリューションを使用したほうがよいでしょう。