回答:
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行にしたい場合は、カンニングしてセミコロンを使用する必要があります。;-)
zip(i, i)
、Python 3ではzip()
、イテレータを返すようになりました。
別のオプション(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}
fromkeys
。 >>> dict.fromkeys(a, 2) {'bi': 2, 'double': 2, 'duo': 2, 'two': 2}
私がかなりクールだと思うもの、つまり、リストが2項目しかない場合:
ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}
dictはiterableを含むすべてのiterableを受け入れますが、iterableの各項目自体がちょうど2つのオブジェクトを持つiterableでなければなりません。
最もパイソンではないかもしれませんが、
>>> b = {}
>>> for i in range(0, len(a), 2):
b[a[i]] = a[i+1]
enumerate
for i, key in enumerate(a[::2]):
。dictコンストラクターがあなたのためにここでほとんどの作業を行うことができるので、Pythonにはまだ不通です
for i, key in enumerate(a[::2]):
アプローチがどのように機能するかについて、もう少し説明してもらえますか?結果のペア値は次のようになります0 hello
と1 1
、それが生成するためにそれらを使用する方法を私には不明です{'hello':'world', '1':'2'}
。
enumerate(a)[::2]
追加の配列を作成しなくてもかなり高速に実行できるため、これは非常に大きな配列でも機能します。
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'}
)
次のようにすることもできます(ここで文字列からリストへの変換、次に辞書への変換)
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でハッシュされるためのデフォルトのイニシャライザである限り、私はまた、この変換のために1つのライナーを持つことに非常に興味があります。
このスレッドで非常に包括的な答えが得られます-
私の1つはPython初心者ですが、Python 2.7ジェネレータ式を使用すると、次のようになります。
dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))
このアプローチを試し、キーと値を別のリストに保存してから、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'}