hevel
hevel

Reputation: 71

python3 make a dict to list of dict by using zip and map

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

Answers (1)

Eugene Yarmash
Eugene Yarmash

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

Related Questions