Pythonのリストa
があり、そのエントリが辞書に便利に対応しているとしましょう。各偶数要素は辞書へのキーを表し、次の奇数要素は値です。
例えば、
a = ['hello','world','1','2']
それを辞書b
に変換したいのですが。
b['hello'] = 'world'
b['1'] = '2'
これを達成するための構文上最もクリーンな方法は何ですか?
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行にしたい場合は、カンニングしてセミコロンを使用する必要があります。 ;-)
別のオプション(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}
これには辞書式の内包表記を非常に簡単に使用できます。
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]
あなたがリストの長さが2項目しかない場合、それはそれがということです:
ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}
覚えておいて、dictはイテラブルを含むイテラブルを受け入れます。イテラブルの各項目はそれ自体がちょうど2つのオブジェクトを持つイテラブルでなければなりません。
最もPythonicではないかもしれませんが、
>>> b = {}
>>> for i in range(0, len(a), 2):
b[a[i]] = a[i+1]
追加の配列を作成しなくてもかなり高速に実行できるので、これは非常に大きな配列でも機能します。
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
このようにすることもできます(ここでリスト変換への文字列、次に辞書への変換)。
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
私はこの変換のためのワンライナーを持つことにも非常に興味を持っています。そのようなリストがPerlにおけるハッシュのためのデフォルトの初期化子である限りです。
このスレッドで非常に包括的な答えが与えられます -
私が(Pythonで初心者にしている)1つを採り入れて、 Python 2.7ジェネレータ式 を使うと、
dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))
以下のコードを試してください:
>>> d2 = dict([('one',1), ('two', 2), ('three', 3)])
>>> d2
{'three': 3, 'two': 2, 'one': 1}
この方法を試して、キーと値を別のリストに保存してから、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'}
{x: a[a.index(x)+1] for x in a if a.index(x) % 2 ==0}
result : {'hello': 'world', '1': '2'}
これが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))