辞書をタプルのリストに変換するにはどうすればよいですか?


218

私が次のような辞書を持っている場合:

{ 'a': 1, 'b': 2, 'c': 3 }

どうすればこれに変換できますか?

[ ('a', 1), ('b', 2), ('c', 3) ]

そして、どうすればこれに変換できますか?

[ (1, 'a'), (2, 'b'), (3, 'c') ]

7
[tuple(reversed(x)) for x in d.items()]
garej 2018年

1
@garej:がコードにx既に含まtupleれている場合(sのitems反復可能オブジェクトを生成するのはその性質ですtuple)、単に行う方が簡単/高速です[x[::-1] for x in d.items()]。逆スライスtupleは、tuple反復子からコンストラクターに繰り返し割り当て(最後に割り当て超過とサイズ変更)するのではなく、適切なサイズの反転を直接作成tuplereversedます。
ShadowRanger

@ShadowRanger、あなたは正しい。そのような場合には常にk, vパターンが必要なわけではないことを明示したかっただけです。
garej

注:compatibility py2.x // py3.xの違いのためにタグを追加
dreftymac

回答:


360
>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> d.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]

それはあなたが望む順序ではありませんが、とにかく辞書は特定の順序を持​​っていません。1必要に応じて、並べ替えまたは整理します。

参照:items()iteritems()


Python 3.xではiteritems(存在しなくなりました)を使用せず、代わりにを使用しますitems。これにより、辞書ビューに「ビュー」が返されます。参照してください。新機能はPython 3.0のドキュメント、および新しいビューのドキュメントを

1:dictsの挿入順序の保存がPython 3.7で追加されました


7
items()は、python3でdict_keysビューを返します。この呼び出しをリスト「list()」へのキャストでラップします。@SilentGhostの返信を参照してください
エーリヒ

54

他には誰もしなかったので、私はpy3kバージョンを追加します:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> list(d.items())
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.items()]
[(1, 'a'), (3, 'c'), (2, 'b')]


10

名前付きタプルのリストを作成する

namedtupleを使用すると非常に便利です。たとえば、次のようなキーとしての「名前」と値としての「スコア」の辞書があります。

d = {'John':5, 'Alex':10, 'Richard': 7}

アイテムをタプルとしてリストし、必要に応じて並べ替えて、名前とスコアを取得できます。たとえば、次のように、Pythonで最も高いスコア(index = 0)のプレーヤーを非常にPythonで指定するとします。

>>> player = best[0]

>>> player.name
        'Alex'
>>> player.score
         10

これを行う方法:

ランダムな順序でリストするか、コレクションの順序を維持します。OrderedDict :

import collections
Player = collections.namedtuple('Player', 'name score')
players = list(Player(*item) for item in d.items())

順番に、値( 'score')でソート:

import collections
Player = collections.namedtuple('Player', 'score name')

最初に最低のスコアで並べ替え:

worst = sorted(Player(v,k) for (k,v) in d.items())

最初に最高のスコアで並べ替え:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)

7

何が欲しいのであるdictitems()iteritems()方法。items(key、value)タプルのリストを返します。タプルは不変なので、元に戻すことはできません。したがって、アイテムを反復処理し、新しいタプルを作成して、逆の(値、キー)タプルを取得する必要があります。反復の場合iteritemsは、リスト全体をメモリに保持する必要はなく、ジェネレータを使用して(key、value)タプルを生成するため、推奨されます。

Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = { 'a': 1, 'b': 2, 'c': 3 }
>>> a.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v,k) for (k,v) in a.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]
>>> 


5

これらは、Python 3.xおよびPython 2.xからの重大な変更です。

Python3.xの場合

dictlist = []
for key, value in dict.items():
    temp = [key,value]
    dictlist.append(temp)

Python 2.7の場合

dictlist = []
for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)

4
>>> a = {'a':1、 'b':2、 'c':3}

>>> [(x、a [x])x for a.keys()]
[( 'a'、1)、( 'c'、3)、( 'b'、2)]

>>> [(a [x]、x)a.keys()のxの場合]
[(1、 'a')、(3、 'c')、(2、 'b')]

4

よるkeys()values()、辞書のメソッドとzip

zip 順序付けされた辞書のように機能するタプルのリストを返します。

デモ:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> zip(d.keys(), d.values())
[('a', 1), ('c', 3), ('b', 2)]
>>> zip(d.values(), d.keys())
[(1, 'a'), (3, 'c'), (2, 'b')]

これはcollections.OrderedDict()、Python HTTPリクエストライブラリの複数のバージョンでうまく機能する代わりに、私にとってはうまくいきました。zip関数名がやや曖昧/オーバーロードされているのが嫌いですが。
MarkHu

zip-ificationは「ディープ」なキャストではないことに注意してください。つまり、ネストされた子がある場合、それらは影響を受けません。あなた自身の再帰をロールする必要があるかもしれません。
MarkHu

3
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list

2
このコードは問題の解決に役立つ可能性がありますが、なぜまたはどのように質問に回答するは説明していません。この追加のコンテキストを提供すると、その長期的な教育的価値が大幅に向上します。回答を編集して、適用される制限や前提条件などの説明を追加してください。
Toby Speight 2016

2

より単純なものは

list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (key, value) tuples

2つ目は単純ではありませんが、そうです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.