リスト内包表記を使ってPythonで辞書を作成する
私はPythonのリスト内包構文が好きです。
辞書の作成にも使えますか?たとえば、キーと値のペアを繰り返し処理することによって、
mydict = {(k,v) for (k,v) in blah blah blah} # doesn't work
Python 2.7と3以降では、 辞書理解構文 を使用する必要があります。
{key: value for (key, value) in iterable}
Python 2.6以前では、dict
ビルトインは反復可能なキー/値ペアを受け取ることができるので、リスト内包表記またはジェネレータ式を渡すことができます。例えば:
dict((key, func(key)) for key in keys)
ただし、すでにキーや値の繰り返し処理が可能な場合は、内包表記を使用する必要はまったくありません。最も単純なのは、dict
組み込み関数を直接呼び出すだけです。
# consumed from any iterable yielding pairs of keys/vals
dict(pairs)
# "zipped" from two separate iterables of keys/vals
dict(Zip(list_of_keys, list_of_values))
Python 3とPython 2.7以降では、辞書の内包表記は次のようになります。
d = {k:v for k, v in iterable}
Python 2.6以前の場合は、 fortranの回答 を参照してください。
実際、すでにある種のマッピングを理解していれば、反復可能オブジェクトを反復処理する必要さえありません。Dictコンストラクターがそれを丁寧に処理します。
>>> ts = [(1, 2), (3, 4), (5, 6)]
>>> dict(ts)
{1: 2, 3: 4, 5: 6}
>>> gen = ((i, i+1) for i in range(1, 6, 2))
>>> gen
<generator object <genexpr> at 0xb7201c5c>
>>> dict(gen)
{1: 2, 3: 4, 5: 6}
Python 2.7では、次のようになります。
>>> list1, list2 = ['a', 'b', 'c'], [1,2,3]
>>> dict( Zip( list1, list2))
{'a': 1, 'c': 3, 'b': 2}
郵便番号 !
@ fortranの答えに追加するために、キーのリストkey_list
と値のリストvalue_list
を繰り返し処理する場合は、次のようにします。
d = dict((key, value) for (key, value) in Zip(key_list, value_list))
または
d = {(key, value) for (key, value) in Zip(key_list, value_list)}
リスト内包表記を使ってPythonで辞書を作成する
私はPythonのリスト内包構文が好きです。
辞書の作成にも使えますか?たとえば、キーと値のペアを繰り返し処理することによって、
mydict = {(k,v) for (k,v) in blah blah blah}
あなたは「辞書理解」というフレーズを探しています - それは実際には:
mydict = {k:v for k,v in iterable}
これはblah blah blahを除いてほぼ有効です。
mydict = {(k,v) for (k,v) in blah blah blah}
^^^^^^--invalid syntax
blah blah blah
が2タプルのイテラブルであると仮定すると - あなたはとても近いです。そのような「blah」を作成しましょう。
blahs = [('blah0', 'blah'), ('blah1', 'blah'), ('blah2', 'blah'), ('blah3', 'blah')]
内包表記構文:
ここでの構文はマッピング部分です。これをdict
内包表記ではなくset
内包表記にするのは(これがあなたの擬似コードが近似するものである)コロンで、:
は以下のようになります。
mydict = {k: v for k, v in blahs}
そして私たちはそれがうまくいったことを見て、そしてPython 3.7のように挿入順を維持するべきです
>>> mydict
{'blah0': 'blah', 'blah1': 'blah', 'blah2': 'blah', 'blah3': 'blah'}
Python 2および3.6までは、順序は保証されていませんでした。
>>> mydict
{'blah0': 'blah', 'blah1': 'blah', 'blah3': 'blah', 'blah2': 'blah'}
フィルタを追加する:
すべての内包表記には、マッピングコンポーネントとフィルタリングコンポーネントがあり、それらを任意の式で指定できます。
それであなたは最後にフィルタ部分を追加することができます:
>>> mydict = {k: v for k, v in blahs if not int(k[-1]) % 2}
>>> mydict
{'blah0': 'blah', 'blah2': 'blah'}
ここでは、キーと値をマッピングする前にデータを除外するために最後の文字が2で割り切れるかどうかをテストしています。
Pythonのバージョン<2.7、以下を実行してください:
d = dict((i,True) for i in [1,2,3])
Pythonバージョン> = 2.7、以下を実行してください:
d = {i: True for i in [1,2,3]}
辞書理解を使用した辞書作成の別の例は、次のとおりです。
私がここでやろうとしているのは、それぞれのペアにアルファベット辞書を作成することです。英字と英字アルファベットにおける対応する位置
>>> import string
>>> dict1 = {value: (int(key) + 1) for key, value in
enumerate(list(string.ascii_lowercase))}
>>> dict1
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8,
'k': 11, 'j': 10, 'm': 13, 'l': 12, 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's':
19, 'r': 18, 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26}
>>>
ここで列挙型を使用してリスト内のアルファベットとそのインデックスのリストを取得し、辞書のキーと値のペアを生成するためにアルファベットとインデックスを交換することに注意してください。
それがあなたに辞書カンプの良い考えを与え、あなたのコードをコンパクトにするためにあなたがそれをもっと頻繁に使うことを奨励することを願っています
これを試して、
def get_dic_from_two_lists(keys, values):
return { keys[i] : values[i] for i in range(len(keys)) }
2つのリスト country と capital があるとします。
country = ['India', 'Pakistan', 'China']
capital = ['New Delhi', 'Islamabad', 'Beijing']
次に、2つのリストから辞書を作成します。
print get_dic_from_two_lists(country, capital)
出力はこんな感じです、
{'Pakistan': 'Islamabad', 'China': 'Beijing', 'India': 'New Delhi'}
別の例を挙げましょう。次のようなリストがあるとします。
nums = [4,2,2,1,3]
キーをインデックス、値をリストの要素とする辞書に変換します。次のコードでそれを行うことができます。
{index:nums[index] for index in range(0,len(nums))}
>>> {k: v**3 for (k, v) in Zip(string.ascii_lowercase, range(26))}
Pythonは辞書内包表記をサポートしています。これにより、実行時に同様の簡潔な構文を使用して辞書の作成を表現できます。
辞書の内包表記は{key:value for(key、value)in iterable}の形式を取ります。この構文はPython 3で導入され、Python 2.7までバックポートされたため、どのバージョンのPythonをインストールしたかにかかわらず使用できるはずです。
標準的な例は、2つのリストを取り、最初のリストの各位置にある項目がキーになり、2番目のリストの対応する位置にある項目が値になる辞書を作成することです。
この内包内で使用されるZip関数は、タプルの反復子を返します。タプルの各要素は、各入力反復可能子の同じ位置から取得されます。上の例では、返されたイテレータにはタプル( "a"、1)、( "b"、2)などが含まれています。
出力:
{'i':512、 'e':64、 'o':2744、 'h':343、 'l':1331、 's':5832、 'b':1、 'w':10648、 ' c ':8、' x ':12167、' y ':13824、' t ':6859、' p ':3375、' d ':27、' j ':729、' a ':0、' z ' :15625、 'f':125、 'q':4096、 'u':8000、 'n':2197、 'm':1728、 'r':4913、 'k':1000、 'g':216 、 'v':9261}
このコードは、pd.DataFrame()
に使用できる異なる値を持つ複数のリストに対してリスト内包表記を使用して辞書を作成します。
#Multiple lists
model=['A', 'B', 'C', 'D']
launched=[1983,1984,1984,1984]
discontinued=[1986, 1985, 1984, 1986]
#Dictionary with list comprehension
keys=['model','launched','discontinued']
vals=[model, launched,discontinued]
data = {key:vals[n] for n, key in enumerate(keys)}
enumerate
は、各n
をそのリストと突き合わせるために、vals
をkey
に渡します。