Amby
Amby

Reputation: 467

Updating new dictionary not working in Python

My code is like this :

nic_map={'vmxnet3':['TrunkPortGroup1','TrunkPortGroup2'], 'vmxnet2':['DataPortGroup1','DataPortGroup2'], 'e1000':['MgmtPortGroup1','MgmtPortGroup2']}

network_list = ['TrunkPortGroup1', 'DataPortGroup1', 'MgmtPortGroup1', 'VM Network', 'External Network']

new_map = {}
for key in nic_map.keys():
    val_list = nic_map.get(key)
    list_comp = [net for net in network_list if net in val_list]
    for network in list_comp:
        new_map[key] = []
        new_map[key].extend(network)
print new_map

I want the output like : {'vmxnet3':'TrunkPortGroup1', 'vmxnet2':'DataPortGroup1', 'e1000':'MgmtPortGroup1'}

But I am getting output as :

{'vmxnet3':'T','r','u','n','k','P','o','r','t','G','r','o','u','p','1', etc...}

Any idea what I'm doing wrong ?

Upvotes: 1

Views: 56

Answers (1)

Martijn Pieters
Martijn Pieters

Reputation: 1121584

You want to just set the list comprehension result

list_comp = [net for net in network_list if net in val_list]
new_map[key] = list_comp

You are using list.extend() to add each individual string to a list; that takes the individual characters of these strings and adds them as separate characters:

>>> lst = []
>>> lst.extend('Hello, world!')
>>> lst
['H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!']

Normally you'd use list.append() instead:

>>> lst = []
>>> lst.append('Hello, world!')
>>> lst
['Hello, world!']

but since you already built a list, why rebuild it at all?

Further improvements can be made; no need to call .keys() explicitly as looping over a dictionary already yields just the keys, and we can use a dict comprehension here. Just loop over the dict.iteritems() iterable to get both keys and values:

new_map = {key: [net for net in network_list if net in value]
           for key, value in nic_map.iteritems()}

Demo:

>>> nic_map = {'vmxnet3': ['TrunkPortGroup1', 'TrunkPortGroup2'], 'vmxnet2': ['DataPortGroup1', 'DataPortGroup2'], 'e1000': ['MgmtPortGroup1', 'MgmtPortGroup2']}
>>> network_list = ['TrunkPortGroup1', 'DataPortGroup1', 'MgmtPortGroup1', 'VM Network', 'External Network']
>>> {key: [net for net in network_list if net in value] for key, value in nic_map.iteritems()}
{'vmxnet2': ['DataPortGroup1'], 'vmxnet3': ['TrunkPortGroup1'], 'e1000': ['MgmtPortGroup1']}

Upvotes: 5

Related Questions