web-dev-qa-db-ja.com

辞書のリストに圧縮された3つのリスト

以下を検討してください。

>>> # list of length n
>>> idx = ['a', 'b', 'c', 'd']

>>> # list of length n
>>> l_1 = [1, 2, 3, 4]

>>> # list of length n
>>> l_2 = [5, 6, 7, 8]

>>> # first key
>>> key_1 = 'mkt_o'

>>> # second key
>>> key_2 = 'mkt_c'

この混乱をこのように圧縮するにはどうすればよいですか?

{
    'a': {'mkt_o': 1, 'mkt_c': 5},
    'b': {'mkt_o': 2, 'mkt_c': 6},
    'c': {'mkt_o': 3, 'mkt_c': 6},
    'd': {'mkt_o': 4, 'mkt_c': 7},
    ...
}

私が持っている最も近いものは次のようなものです:

>>> dict(Zip(idx, Zip(l_1, l_2)))
{'a': (1, 5), 'b': (2, 6), 'c': (3, 7), 'd': (4, 8)}

もちろん、辞書の代わりにタプルを値として持っています。

>>> dict(Zip(('mkt_o', 'mkt_c'), (1,2)))
{'mkt_o': 1, 'mkt_c': 2}

これは有望に思えるかもしれませんが、やはり要件を満たしていません。

20
Jason Strimpel
{k : {key_1 : v1, key_2 : v2} for k,v1,v2 in Zip(idx, l_1, l_2)}
38
DYZ

ソリューション1Zipを2回使用できます(実際には3回)dictionary comprehensionこれを次のように達成します:

idx = ['a', 'b', 'c', 'd']
l_1 = [1, 2, 3, 4]
l_2 = [5, 6, 7, 8]

keys = ['mkt_o', 'mkt_c']   # yours keys in another list

new_dict = {k: dict(Zip(keys, v)) for k, v in Zip(idx, Zip(l_1, l_2))}

ソリューション2:ネストされたlist comprehensionZipを使用することもできます。

new_dict = dict(Zip(idx, [{key_1: i, key_2: j} for i, j in Zip(l_1, l_2)]))

ソリューション3:共有されるZipの上にdictionary comprehensionを使用- DYZの答え

new_dict = {k : {key_1 : v1, key_2 : v2} for k,v1,v2 in Zip(idx, l_1, l_2)}

上記のすべてのソリューションは、new_dictを次のように返します。

{
     'a': {'mkt_o': 1, 'mkt_c': 5}, 
     'b': {'mkt_o': 2, 'mkt_c': 6}, 
     'c': {'mkt_o': 3, 'mkt_c': 7},
     'd': {'mkt_o': 4, 'mkt_c': 8}
 }
15

辞書、リスト、インデックス、キーを操作していて、データを転置したいとします。 pandasDataFrame.T および .to_dict ):

>>> import pandas as pd
>>> idx = ['a', 'b', 'c', 'd']
>>> l_1 = [1, 2, 3, 4]
>>> l_2 = [5, 6, 7, 8]
>>> key_1 = 'mkt_o'
>>> key_2 = 'mkt_c'
>>> pd.DataFrame([l_1, l_2], index=[key_1, key_2], columns = idx)
       a  b  c  d
mkt_o  1  2  3  4
mkt_c  5  6  7  8
>>> pd.DataFrame([l_1, l_2], index=[key_1, key_2], columns = idx).T
   mkt_o  mkt_c
a      1      5
b      2      6
c      3      7
d      4      8
>>> pd.DataFrame([l_1, l_2], index=[key_1, key_2], columns = idx).to_dict()
{'a': {'mkt_o': 1, 'mkt_c': 5},
 'b': {'mkt_o': 2, 'mkt_c': 6},
 'c': {'mkt_o': 3, 'mkt_c': 7},
 'd': {'mkt_o': 4, 'mkt_c': 8}
}
2
Eric Duminil

これは、dict、Zip、ma​​p、およびitertoolsからの繰り返しでも実行できます。

>>> from itertools import repeat
>>> dict(Zip(idx, map(dict, Zip(zip(repeat(key_1), l_1), Zip(repeat(key_2), l_2)))))
{'a': {'mkt_c': 5, 'mkt_o': 1}, 'c': {'mkt_c': 7, 'mkt_o': 3}, 'b': {'mkt_c': 6, 'mkt_o': 2}, 'd': {'mkt_c': 8, 'mkt_o': 4}}
1
Dan D.