3

辞書の値とキーを交換することについての2つの質問を読みました:Python:辞書の値とキーを交換する最良の方法?; キーを辞書の値と交換する方法は?

促進される最良の方法は次のとおりです。

dict((v,k) for k,v in d.items())

ただし、このような辞書の場合:

d = {"one":1, "two":2, "a":1}

蛾は交換された辞書を取得します:

{1: 'one', 2: 'two'}

アイテム(1:'a')が失われます。では、どうすればこの{1:('one'、'a')、2:'two'}のような辞書を入手できますか?ありがとう。

4

4 に答える 4

4

これを行う1つの方法は次のとおりです。

In [101]: d = {"one":1, "two":2, "a":1}

In [102]: answer = collections.defaultdict(list)

In [103]: for k,v in d.iteritems():
   .....:     answer[v].append(k)

   .....:     

In [104]: answer
Out[104]: defaultdict(<type 'list'>, {1: ['a', 'one'], 2: ['two']})

In [105]: dict(answer)
Out[105]: {1: ['a', 'one'], 2: ['two']}

In [106]: dict((k, tuple(v)) for k,v in answer.iteritems())
Out[106]: {1: ('a', 'one'), 2: ('two',)}

あなたが本当にワンライナーが欲しいなら(私はこれに対して強くお勧めします-それは非常に非効率的です):

In [110]: d
Out[110]: {'a': 1, 'one': 1, 'two': 2}

In [111]: dict((v, tuple([key for key in d if d[key]==v])) for k,v in d.iteritems())
Out[111]: {1: ('a', 'one'), 2: ('two',)}

お役に立てれば

于 2012-11-20T07:33:30.967 に答える
4

あなたが使用することができますdict.setdefault()

In [6]: dd={}

In [7]: for x,y in d.items():
   ...:     dd.setdefault(y,[]).append(x)
   ...:     

In [8]: dd
Out[8]: {1: ['a', 'one'], 2: ['two']}

または、次を使用することもできますdefaultdict()

In [1]: from collections import defaultdict

In [2]: d = {"one":1, "two":2, "a":1}

In [3]: dd=defaultdict(list)

In [4]: for x,y in d.items():
   ...:     dd[y].append(x)
   ...:     

In [5]: dd
Out[5]: defaultdict(<type 'list'>, {1: ['a', 'one'], 2: ['two']})
于 2012-11-20T07:33:38.267 に答える
2
d = {"one":1, "two":2, "a":1}
a = {}
for k,v in d.iteritems():
    a.setdefault(v, []).append(k)

ワンライナーでなければならない場合:

import itertools as it
import operator as op

a = {k:tuple(b[0] for b in v) for k,v in it.groupby(sorted(d.items(), key=op.itemgetter(1)), key=op.itemgetter(1))}
于 2012-11-20T07:35:02.963 に答える
0

ライナーが1つあるかどうかはわかりませんが、これは機能します。

old = {"one": 1, "two": 2, "a": 1}
new = {}

for key, val in old.iteritems():
    new[val] = new.get(val, []) + [key]
于 2012-11-20T07:33:39.000 に答える