Reputation: 71
I'm trying to make a dict to list of dict like (A=>B):
A:
{
"macro": ["{$URL}","{$USERNAME}","{$PASSWORD}"],
"value": ['https://1.1.1.1/sdk',"vmuser","vm@2980"]
}
B:
[
{
"macro": "{$PASSWORD}",
"value": "vm@2980"
},
{
"macro": "{$USERNAME}",
"value": "vmuser"
},
{
"macro": "{$URL}",
"value": 'https://' + hostip + '/sdk'
},
]
my solution is follow below,but the python2 work as i though,python3 is not.
Python 2.7.9
>>> cc=dict(macro=["{$URL}","{$USERNAME}","{$PASSWORD}"],value=['https://' + "123" + '/sdk',"vmuser","vm@2980"])
>>> 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': 'vm@2980'}]]
>>> ret[0]
[{'macro': '{$URL}'}, {'macro': '{$USERNAME}'}, {'macro': '{$PASSWORD}'}]
>>> zip(*ret)
[({'macro': '{$URL}'}, {'value': 'https://123/sdk'}), ({'macro': '{$USERNAME}'}, {'value': 'vmuser'}), ({'macro': '{$PASSWORD}'}, {'value': 'vm@2980'})]
Python 3.4.2
>>> cc=dict(macro=["{$URL}","{$USERNAME}","{$PASSWORD}"],value=['https://' + "123" + '/sdk',"vmuser","vm@2980"])
>>> 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}'})
I'm wondering why python3 key is macro?any better method to do ?
Upvotes: 0
Views: 103
Reputation: 149756
In Python 3 map()
returns an iterator, while in Python 2 it returns a list. To get the same list in Python 3 you would need to wrap the map()
in a list()
.
That said, to get a list in the desired format you could use zip()
with a list comprehension:
B = [{"macro": m, "value": v} for m, v in zip(A["macro"], A["value"])]
Demo:
>>> A = {
... "macro": ["{$URL}", "{$USERNAME}", "{$PASSWORD}"],
... "value": ["https://1.1.1.1/sdk", "vmuser", "vm@2980"]
... }
>>> [{"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': 'vm@2980'}]
Upvotes: 4