1

我想这个标题可能会让你有点困惑,但我敢肯定有太多人面临这个问题,而且他们中的大多数人可能知道如何解决它。

这是我的问题,我有一个 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'}
]

我需要将顶部对象字段映射为带有列表的第二个对象键。我写了一个简单的 for 来制作第二个并且它可以工作,我已经用这个创建了第二个 for,但我很好奇有一种简单的方法可以让它工作。

这是我的循环:

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'])))

但这对我不起作用。

有没有人向我建议一种更好、更快、更简单的方法来做到这一点?

问候。

4

2 回答 2

6
[dict(zip(configSet['fields'], result)) for result in configSet['results']]

对于 中的每个结果,使用结果中的键和值results创建一个字典。fields

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}]
于 2013-03-08T12:26:18.400 回答
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'}
]
于 2013-03-08T12:53:31.090 回答