2017-08-24 8 views
0

マップ:のpython3はジッパーを使用して辞書のリストに辞書を作成し、私は(A => B)のような辞書のリストに辞書を作成しようとしている

A:

{ 
    "macro": ["{$URL}","{$USERNAME}","{$PASSWORD}"], 
    "value": ['https://1.1.1.1/sdk',"vmuser","[email protected]"] 
} 

B :

[ 
     { 
      "macro": "{$PASSWORD}", 
      "value": "[email protected]" 
     }, 
     { 
      "macro": "{$USERNAME}", 
      "value": "vmuser" 
     }, 
     { 
      "macro": "{$URL}", 
      "value": 'https://' + hostip + '/sdk' 
     }, 
] 

私の解決策は以下の通りですが、python2は私の仕事ですが、python3はそうではありません。

のPython 2.7.9

>>> cc=dict(macro=["{$URL}","{$USERNAME}","{$PASSWORD}"],value=['https://' + "123" + '/sdk',"vmuser","[email protected]"]) 
>>> ret=[] 
>>> for k,v in cc.items(): 
... ret.append(map(lambda x:{k: x},v)) 
... 
>>> ret 
[[{'macro': '{$URL}'}, {'macro': '{$USERNAME}'}, {'macro': '{$PASSWORD}'}], [{'value': 'https://123/sdk'}, {'value': 'vmuser'}, {'value': '[email protected]'}]] 
>>> ret[0] 
[{'macro': '{$URL}'}, {'macro': '{$USERNAME}'}, {'macro': '{$PASSWORD}'}] 
>>> zip(*ret) 
[({'macro': '{$URL}'}, {'value': 'https://123/sdk'}), ({'macro': '{$USERNAME}'}, {'value': 'vmuser'}), ({'macro': '{$PASSWORD}'}, {'value': '[email protected]'})] 

のPython 3.4.2

>>> cc=dict(macro=["{$URL}","{$USERNAME}","{$PASSWORD}"],value=['https://' + "123" + '/sdk',"vmuser","[email protected]"]) 
>>> ret=[] 
>>> for k,v in cc.items(): 
... ret.append(map(lambda x:{k: x},v)) 
... 
>>> ret 
[<map object at 0x7faed946c1d0>, <map object at 0x7faed946c208>] 
>>> ret=[] 
>>> for k,v in cc.items(): 
... ret.append(map(lambda x:{k: x},v)) 
... 
>>> ret 
[<map object at 0x7faed946c390>, <map object at 0x7faed946c400>] 
>>> c=zip(*ret) 
>>> next(c) 
({'macro': 'https://123/sdk'}, {'macro': '{$URL}'}) 

のpython3キーがマクロである理由私は思ったんだけど?行うに任意のより良い方法?

+0

'ret.append(リスト(マップ(ラムダを使用しますが、リスト内包でzip()を使用することができます希望の形式でリストを取得するには、言わ

x:{k:x}、v))) 'と同じ結果を返す。 – Zety

答えて

4

Python 3ではイテレータを返しますが、Python 2ではリストを返します。 Python 3で同じリストを取得するには、map()list()にラップする必要があります。

B = [{"macro": m, "value": v} for m, v in zip(A["macro"], A["value"])] 

デモ:

>>> A = { 
...  "macro": ["{$URL}", "{$USERNAME}", "{$PASSWORD}"], 
...  "value": ["https://1.1.1.1/sdk", "vmuser", "[email protected]"] 
... } 
>>> [{"macro": m, "value": v} for m, v in zip(A["macro"], A["value"])] 
[{'macro': '{$URL}', 'value': 'https://1.1.1.1/sdk'}, {'macro': '{$USERNAME}', 'value': 'vmuser'}, {'macro': '{$PASSWORD}', 'value': '[email protected]'}] 
関連する問題