我想这个标题可能会让你有点困惑,但我确信有太多人面对这个问题而且大多数人都知道如何解决它。
这是我的问题,我有一个像下面这样的dict对象:
{ '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)]
]
}
我想将它转换为包含这样的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'}
]
我需要将顶部对象字段映射为带有列表的第二个对象键。我写了一个简单的第二个并且它有效,我已经创建了第二个,但是我很好奇有一种简单的方法可以使它工作。
这是我的循环:
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
我尝试像这样处理dict,list,map和zip组合
dict(map(list, zip(configSet['fields'], configSet['results'])))
但它对我不起作用。
有没有人向我建议一个更好,更快速,更简单的方法呢?
问候。
答案 0 :(得分:6)
[dict(zip(configSet['fields'], result)) for result in configSet['results']]
对于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}]
答案 1 :(得分:0)
不知道你在哪里获得'新鲜呼吸',但我认为这可以做你想做的事情:
d={'fields':['Config',...],'results': [[23,...],[23,...]]}
keys=['username', 'transport_protocol', 'Device Name', ...]
resultlist = [{field:value for field,value in zip(keys, [v[d['fields'].index(k)] for k in keys])} for v in d['results']]
修改:刚刚看到了主要答案,该答案使用了变体dict(keys, values)
,而不是我的混淆{key:value for key,value in ...}
,所以我的最多是多余的。尽管如此,有希望让我的答案与某个方面相关的是它允许从子集中选择密钥,我原本认为这是你的目标。
输出:
[
{'username': 'Cisco', 'transport_protocol': 'Telnet', 'Device Name': 'New test2 for demo'},
{'username': 'Cisco', 'transport_protocol': 'Telnet', 'Device Name': 'Test after a couple hours'}
]