10

タプルのリストが2つある場合

tuple2list=[(4, 21), (5, 10), (3, 8), (6, 7)]

tuple3list=[(4, 180, 21), (5, 90, 10), (3, 270, 8), (6, 0, 7)]

以下のように辞書に変換するにはどうすればよいですか?

tuple2list2dict={4:21, 5:10, 3:8, 6:7}

tuple3list2dict={4: {180:21}, 5:{90:10}, 3:{270:8}, 6:{0:7}}

私は、タプルの 2 つの要素に対してそれを行う方法を知っています。

tuple2list2dict=dict((x[0], index) for index,x in enumerate(tuple2list))

しかし、私が問題を抱えている3つの要素については、以下を試してみるとエラーが発生します.

tuple3list2dict=dict((x[0], dict(x[1], index)) for index,x in enumerate(tuple3list))

上記のコードを 3 要素タプルに再利用して辞書を作成するにはどうすればよいですか?

これについてもっと読むことができる場所を教えてください。インターネットで見つけるのに苦労します。

4

3 に答える 3

14

Python2.7 以降では、dict 内包表記を使用できます。

In [100]: tuplelist = [(4, 180, 21), (5, 90, 10), (3, 270, 8), (4, 0, 7)]

In [101]: tuplelist2dict = {a:{b:c} for a,b,c in tuplelist}

In [102]: tuplelist2dict
Out[102]: {3: {270: 8}, 4: {0: 7}, 5: {90: 10}}

Python2.6 以前では、同等のものは次のようになります。

In [26]: tuplelist2dict = dict((a,{b:c}) for a,b,c in tuplelist)

タプルの最初の値が複数回発生する場合 (上記の例のように)、結果には、共有キーを持つ最後のtuplelist2dictタプルに対応する 1 つのキーと値のペアのみが含まれることに注意してください。

于 2013-01-10T17:19:40.463 に答える
3

このペアケースは、辞書の構築と一致するため、単純です。

... 位置引数は反復子オブジェクトでなければなりません。iterable 内の各アイテムは、それ自体が正確に 2 つのオブジェクトを持つ反復子でなければなりません。各項目の最初のオブジェクトは新しい辞書のキーになり、2 番目のオブジェクトは対応する値になります。

>>> t = [(4, 21), (5, 10), (3, 8), (4, 7)]
>>> dict(t)
{3: 8, 4: 7, 5: 10}

トリプル ケースは、次の方法で解決できます。

>>> t = [(4, 180, 21), (5, 90, 10), (3, 270, 8), (4, 0, 7)]
>>> dict([ (k, [v, w]) for k, v, w in t ])
{3: [270, 8], 4: [0, 7], 5: [90, 10]}

またはもう少し一般的に:

>>> dict([ (k[0], k[1:]) for k in t ]) # hello car, hi cdr
{3: (270, 8), 4: (0, 7), 5: (90, 10)}

あなたのコードに注意してください:

_3_tuplelist_to_dict = {4: {180:21}, 5:{90:10}, 3:{270:8}, 4:{0:7}}

これは、実際には紛らわしい表現です。

{3: {270: 8}, 4: {0: 7}, 5: {90: 10}}

試す:

>>> {4: {180:21}, 5:{90:10}, 3:{270:8}, 4:{0:7}} == \
    {3: {270: 8}, 4: {0: 7}, 5: {90: 10}}
True

Python 3 では、dict 内包表記を使用できます。

>>> t = [(4, 180, 21), (5, 90, 10), (3, 270, 8), (4, 0, 7)]
>>> {key: values for key, *values in t}
{3: [270, 8], 4: [0, 7], 5: [90, 10]}
于 2013-01-10T17:19:56.517 に答える