web-dev-qa-db-ja.com

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

Pythonのリストaがあり、そのエントリが辞書に便利に対応しているとしましょう。各偶数要素は辞書へのキーを表し、次の奇数要素は値です。

例えば、

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

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

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

これを達成するための構文上最もクリーンな方法は何ですか?

163
Mike
b = dict(Zip(a[::2], a[1::2]))

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

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

Python 3ではあなたは辞書内包表記を使うこともできますが、皮肉なことにそれをするための最も簡単な方法はrange()len()を使うことになると思います。

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

EOLがコメントで述べているようにiter()/izip()はPython 3ではすでに怠惰なので_ Zip()は必要ないので、izip()メソッドはまだPython 3でおそらく最もPythonicです。

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

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

243
kindall

簡単な答え

別のオプション(Alex Martelli https://stackoverflow.com/a/2597178/104264 による)

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}
45
JobJob

これには辞書式の内包表記を非常に簡単に使用できます。

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]
15
Chris Arena

あなたがリストの長さが2項目しかない場合、それはそれがということです:

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

覚えておいて、dictはイテラブルを含むイテラブルを受け入れます。イテラブルの各項目はそれ自体がちょうど2つのオブジェクトを持つイテラブルでなければなりません。

10
rix

最もPythonicではないかもしれませんが、

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

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

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
4
topkara

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

    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におけるハッシュのためのデフォルトの初期化子である限りです。

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

私が(Pythonで初心者にしている)1つを採り入れて、 Python 2.7ジェネレータ式 を使うと、

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

1
Oleksiy

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

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

この方法を試して、キーと値を別のリストに保存してから、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'}
0
Aaditya Ura
{x: a[a.index(x)+1] for x in a if a.index(x) % 2 ==0}

result : {'hello': 'world', '1': '2'}
0
Mahdi Ghelichi

これが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
Manu