web-dev-qa-db-ja.com

グループ化Python辞書キーをリストとして使用し、このリストを値として新しい辞書を作成します

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のキーをソートする必要があることに注意してください。この辞書の作成を視覚化し、実装するのは難しいと感じています。簡単で効率的な方法を教えてください。

33
Shankar

_collections.defaultdict_ を使用して簡単に:

_from collections import defaultdict

v = defaultdict(list)

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

しかし、沼地の標準dictでもできます:

_v = {}

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

Python 3)では、代わりにsorted(d.items())を使用します。

55
Martijn Pieters

実際に1日の終わりに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))

もちろん、あなたが本当にしたいなら、これを使って辞書を作成することができます:

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

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

14
mgilson