dictするpythonタプル


149

タプルの場合、t = ((1, 'a'),(2, 'b')) dict(t)戻り値{1: 'a', 2: 'b'}

取得するための良い方法はあり{'a': 1, 'b': 2}ますか(キーと値を交換する)?

最終的に、私は返すことができるようにしたい1与え'a'たり2与えられ'b'、おそらく辞書に変換する最良の方法ではありません。

回答:


277

試してください:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}

8
+1 Beautiful!、zipで試してみました dict(zip(*zip(*t)[::-1]))。これは遅く、醜く、より多くのメモリを使用しています。
kevpie

@kevpie Pythonのすばらしい点は、何かを行う方法を表現する方法が100通りあり、それぞれが次の方法と同じくらい興味深いことです。
bjd2385 2017年

あなたが持っているものがあなたができるトリプルであるならば、素晴らしい:dict((x, y) for x, y, z in t)またはdict((x, (y, z)) for x, y, z in t)タプルとして2番目と3番目の値を取得すること。
偽装

非常に高速で、包括的でシンプルです。完璧な答え。
gies0r 2018年

73

少し簡単な方法:

>>> t = ((1, 'a'),(2, 'b'))
>>> dict(map(reversed, t))
{'a': 1, 'b': 2}

1
これを速くするものは何ですか?
maazza 2013

9
map関数とdict関数はCで実装されており、どのpythonバージョンよりもはるかに高速です
jterrace

1
私はreverse明示的に綴られているのでこれが好きです。
Frerich Raabe 2013

4
@maazza:一般に、パフォーマンステストは、(少なくともCの実装でmapは)マップされるものが別の組み込み関数(などreversed)である場合、内包よりも高速であることを示唆しています。他のほとんどの場合、その逆が当てはまります。しかし、推測するよりも
プロファイリング

43

Python 2.7を使用している場合は、さらに簡潔になります。

>>> t = ((1,'a'),(2,'b'))
>>> {y:x for x,y in t}
{'a':1, 'b':2}

9
>>> dict([('hi','goodbye')])
{'hi': 'goodbye'}

または:

>>> [ dict([i]) for i in (('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14)) ]
[{'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}]

私は表示されませんどのようにこの回答OPの質問
ルカAmerio

4

同じキーに複数の値がある場合、次のコードはそれらの値をそれらのキーに対応するリストに追加します。

d = dict()
for x,y in t:
    if(d.has_key(y)):
        d[y].append(x)
    else:
        d[y] = [x]

2

いくつかの方法があります:

>>> t = ((1, 'a'), (2, 'b'))

>>> # using reversed function
>>> dict(reversed(i) for i in t)
{'a': 1, 'b': 2}

>>> # using slice operator
>>> dict(i[::-1] for i in t)
{'a': 1, 'b': 2}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.