Pythonでリストを辞書に変換する


189

aエントリが辞書にマップされるPythonのリストがあるとします。各偶数要素は辞書のキーを表し、次の奇数要素は値です

例えば、

a = ['hello','world','1','2']

それを辞書に変換したいのですがb

b['hello'] = 'world'
b['1'] = '2'

これを達成する構文的に最もクリーンな方法は何ですか?


回答:


269
b = dict(zip(a[::2], a[1::2]))

aが大きい場合、おそらく次のようなことをしたいと思うでしょう。これは上記のような一時的なリストを作成しません。

from itertools import izip
i = iter(a)
b = dict(izip(i, i))

Python 3ではdict内包表記を使用することもできますが、皮肉なことに、それを行う最も簡単な方法はrange()and len()を使用することです。

b = {a[i]: a[i+1] for i in range(0, len(a), 2)}

そのため、iter()/izip()EOLがコメントで指摘しているように、このメソッドはおそらくPython 3で最もPythonicであると思われますが、Python 3ではzip()すでに遅延しているため、必要ありませんizip()

i = iter(a)
b = dict(zip(i, i))

1行にしたい場合は、カンニングしてセミコロンを使用する必要があります。;-)


9
…または単にzip(i, i)、Python 3ではzip()、イテレータを返すようになりました。
Eric O Lebigot、2011年

5
Python 2.7.3にもdictの理解があることに注意してください
user1438003 '22

56

簡単な答え

別のオプション(Alex Martelliの厚意による - ソース):

dict(x[i:i+2] for i in range(0, len(x), 2))

関連メモ

これがあれば:

a = ['bi','double','duo','two']

そしてあなたはこれを望みます(リストの各要素は与えられた値(この場合2)をキーイングします):

{'bi':2,'double':2,'duo':2,'two':2}

あなたは使うことができます:

>>> dict((k,2) for k in a)
{'double': 2, 'bi': 2, 'two': 2, 'duo': 2}

2
これはPython 3のみですか?
Tagar 2015

2
使用しますfromkeys>>> dict.fromkeys(a, 2) {'bi': 2, 'double': 2, 'duo': 2, 'two': 2}
Gdogg 2017

1
これは、質問が求めていること以外のことをしています。
ozn

17

dict内包表記をこれを使ってかなり簡単に使用できます。

a = ['hello','world','1','2']

my_dict = {item : a[index+1] for index, item in enumerate(a) if index % 2 == 0}

これは、以下のforループと同等です。

my_dict = {}
for index, item in enumerate(a):
    if index % 2 == 0:
        my_dict[item] = a[index+1]

10

私がかなりクールだと思うもの、つまり、リストが2項目しかない場合:

ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}

dictはiterableを含むすべてのiterableを受け入れますが、iterableの各項目自体がちょうど2つのオブジェクトを持つiterableでなければなりません。


リストが3つ以上の項目を含んでいる場合に追加するために、迅速かつ簡単な方法を使用し、dict([ls])ではな​​くdict(ls)を使用します。たとえば、ls = ['a'、 'b'、 'c'、 'd']の場合、dict(ls)
ankit tyagi

1
素敵で滑らか。「イテラブルの各アイテムは、それ自体が2つのオブジェクトを持つイテラブルでなければなりません。ここで重要な事実です。
Abhijeet

4

最もパイソンではないかもしれませんが、

>>> b = {}
>>> for i in range(0, len(a), 2):
        b[a[i]] = a[i+1]

10
お読みくださいenumerate
SilentGhost

5
enumerateではステップサイズを指定できませんが、を使用できますfor i, key in enumerate(a[::2]):。dictコンストラクターがあなたのためにここでほとんどの作業を行うことができるので、Pythonにはまだ不通です
John La Rooy

@ SilentGhost、gnibbler:視野を広げてくれてありがとう!今後も是非組み込んでいきます!
sahhhm

@gnibbler:for i, key in enumerate(a[::2]):アプローチがどのように機能するかについて、もう少し説明してもらえますか?結果のペア値は次のようになります0 hello1 1、それが生成するためにそれらを使用する方法を私には不明です{'hello':'world', '1':'2'}
マーティ

1
@martineau、あなたは正しいです。私は意味があったに違いないと思いますenumerate(a)[::2]
ジョン・ラ・ロイ、2011年

4

追加の配列を作成しなくてもかなり高速に実行できるため、これは非常に大きな配列でも機能します。

dict(izip(*([iter(a)]*2)))

あなたがジェネレーターを持っているならa、さらに良い:

dict(izip(*([a]*2)))

以下がその概要です。

iter(h)    #create an iterator from the array, no copies here
[]*2       #creates an array with two copies of the same iterator, the trick
izip(*())  #consumes the two iterators creating a tuple
dict()     #puts the tuples into key,value of the dictionary

これにより、キーと値のペアが等しい辞書が作成されます({'hello':'hello','world':'world','1':'1','2':'2'}
mik

いいえ、すべてうまくいきます。もっと注意深く読んでください。「ジェネレーターがある場合は...」と表示されます。ジェネレーターがない場合は、最初の行を使用してください。2つ目は、ほとんどの場合、リストの代わりにジェネレーターがある場合に役立つ代替手段です。
トプカラ2018

1

次のようにすることもできます(ここで文字列からリストへの変換、次に辞書への変換)

    string_list = """
    Hello World
    Goodbye Night
    Great Day
    Final Sunset
    """.split()

    string_list = dict(zip(string_list[::2],string_list[1::2]))

    print string_list

1

このようなリストがPerlでハッシュされるためのデフォルトのイニシャライザである限り、私はまた、この変換のために1つのライナーを持つことに非常に興味があります。

このスレッドで非常に包括的な答えが得られます-

私の1つはPython初心者ですが、Python 2.7ジェネレータ式を使用すると、次のようになります。

dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))


0

これがpythonicかどうかはわかりませんが、うまくいくようです

def alternate_list(a):
   return a[::2], a[1::2]

key_list,value_list = alternate_list(a)
b = dict(zip(key_list,value_list))

0

以下のコードを試してください:

  >>> d2 = dict([('one',1), ('two', 2), ('three', 3)])
  >>> d2
      {'three': 3, 'two': 2, 'one': 1}

0

このアプローチを試し、キーと値を別のリストに保存してから、dictメソッドを使用することもできます

data=['test1', '1', 'test2', '2', 'test3', '3', 'test4', '4']

keys=[]
values=[]
for i,j in enumerate(data):
    if i%2==0:
        keys.append(j)
    else:
        values.append(j)

print(dict(zip(keys,values)))

出力:

{'test3': '3', 'test1': '1', 'test2': '2', 'test4': '4'}

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