Fat*_*ana 1 python mapping dictionary list
我想这个标题可能会让你有点困惑,但我确信有太多人面对这个问题而且他们中的大多数人可能知道如何解决它.
这是我的问题,我有一个像下面的字典对象:
{ 'fields':
['Config', 'Device', 'Device Name', 'Config Name', 'description', 'ip', 'radius', 'ssid','vlan', 'channel', 'frequency', 'maxclients', 'username', 'password', 'enable_password','transport_protocol', 'personality', 'date_added', 'date_modified'],
'results': [
[23, 45, 'New test2 for demo', 'New test2 for demo', 'Default desc for device','192.168.0.100',13, '0', 0, 4, 'None', None, 'Cisco', 'Cisco', 'Cisco', 'Telnet', 'ios',datetime.datetime(2013, 3, 6, 13, 52, 14), datetime.datetime(2013, 3, 7, 14, 27, 39)],
[23, 47, 'Test after a couple hours', 'New test2 for demo', 'Default desc for device','192.168.0.100', 13, '0', 0, 4, 'None', None, 'Cisco', 'Cisco', 'Cisco', 'Telnet', 'ios',datetime.datetime(2013, 3, 6, 13, 52, 14), datetime.datetime(2013, 3, 7, 14, 27, 39)]
]
}
Run Code Online (Sandbox Code Playgroud)
我想将它转换为包含这样的dict对象的列表:
[
{'username': 'Cisco', 'transport_protocol': 'Telnet', 'Device Name': 'With a fresh breath','description': 'Default desc for device', 'date_added': datetime.datetime(2013, 3, 8, 9, 32, 13),'date_modified': datetime.datetime(2013, 3, 8, 9, 32, 13), 'ip': '192.168.0.100', 'vlan': 0,'enable_password': 'Cisco', 'Config Name': 'With a fresh breath', 'frequency': '0', 'radius': 0, 'personality': 'ios', 'Device': 49, 'maxclients': 0, 'password': 'Cisco', 'Config': 27, 'channel': 0, 'ssid': 'LBREAP'},
{'username': 'Cisco', 'transport_protocol': 'Telnet', 'Device Name': 'With a fresh breath for second device', 'description': 'Default desc for device', 'date_added': datetime.datetime(2013, 3, 8, 9, 33, 57), 'date_modified': datetime.datetime(2013, 3, 8, 11, 23, 1), 'ip': '192.168.0.35', 'vlan': 0, 'enable_password': 'Cisco', 'Config Name': 'With a fresh breath for second device', 'frequency': '0', 'radius': 0, 'personality': 'ios', 'Device': 50, 'maxclients': 0, 'password': 'Cisco', 'Config': 28, 'channel': 4, 'ssid': 'LBREAP'}
]
Run Code Online (Sandbox Code Playgroud)
我需要将顶部对象字段映射为带有列表的第二个对象键.我已经写了一个简单的第二个,它可以工作,我已经创建了第二个,但我很好奇,有一个简单的方法来使这项工作.
这是我的循环:
results = list()
if configSet['results']:
k = 0
for i in configSet['results']:
rSet = {}
r = 0
for f in i:
rSet[configSet['fields'][r]] = f
r += 1
results.insert(k, rSet)
k += 1
Run Code Online (Sandbox Code Playgroud)
我试着像这样处理dict,list,map和zip组合
dict(map(list, zip(configSet['fields'], configSet['results'])))
Run Code Online (Sandbox Code Playgroud)
但它对我不起作用.
有没有人向我建议一个更好,快速和简单的方法呢?
问候.
[dict(zip(configSet['fields'], result)) for result in configSet['results']]
Run Code Online (Sandbox Code Playgroud)
对于每个结果results,使用键fields和来自结果的值创建一个dict .
In [6]: [dict(zip(configSet['fields'], result)) for result in configSet['results']]
Out[6]:
[{'Config': 23,
'Config Name': 'New test2 for demo',
'Device': 45,
'Device Name': 'New test2 for demo',
'channel': 4,
'date_added': datetime.datetime(2013, 3, 6, 13, 52, 14),
'date_modified': datetime.datetime(2013, 3, 7, 14, 27, 39),
'description': 'Default desc for device',
'enable_password': 'Cisco',
'frequency': 'None',
'ip': '192.168.0.100',
'maxclients': None,
'password': 'Cisco',
'personality': 'ios',
'radius': 13,
'ssid': '0',
'transport_protocol': 'Telnet',
'username': 'Cisco',
'vlan': 0},
{'Config': 23,
'Config Name': 'New test2 for demo',
'Device': 47,
'Device Name': 'Test after a couple hours',
'channel': 4,
'date_added': datetime.datetime(2013, 3, 6, 13, 52, 14),
'date_modified': datetime.datetime(2013, 3, 7, 14, 27, 39),
'description': 'Default desc for device',
'enable_password': 'Cisco',
'frequency': 'None',
'ip': '192.168.0.100',
'maxclients': None,
'password': 'Cisco',
'personality': 'ios',
'radius': 13,
'ssid': '0',
'transport_protocol': 'Telnet',
'username': 'Cisco',
'vlan': 0}]
Run Code Online (Sandbox Code Playgroud)