Reputation: 467
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
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