我的代码是这样的:
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
我想要这样的输出:{'vmxnet3':'TrunkPortGroup1', 'vmxnet2':'DataPortGroup1', 'e1000':'MgmtPortGroup1'}
但是我得到的输出是:
{'vmxnet3':'T','r','u','n','k','P','o','r','t','G' ,'r','o','u','p','1' 等...
知道我做错了什么吗?
最佳答案
你只想设置列表理解结果
list_comp = [net for net in network_list if net in val_list]
new_map[key] = list_comp
您正在使用 list.extend()
将每个单独的字符串添加到列表中;获取这些字符串的各个字符并将它们添加为单独的字符:
>>> lst = []
>>> lst.extend('Hello, world!')
>>> lst
['H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!']
通常你会使用 list.append()
代替:
>>> lst = []
>>> lst.append('Hello, world!')
>>> lst
['Hello, world!']
但是既然您已经建立了一个列表,为什么还要重建它呢?
可以进一步改进;无需显式调用 .keys()
,因为遍历字典已经只生成键,我们可以在这里使用字典理解。只需遍历 dict.iteritems()
可迭代对象即可获取键和值:
new_map = {key: [net for net in network_list if net in value]
for key, value in nic_map.iteritems()}
演示:
>>> 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']}
关于python - 更新新词典在 Python 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23864699/