2013-03-08 191 views
1

我猜标题可能会让你有点困惑,但我相信很多人面临这个问题,他们中的大多数可能知道如何解决它。Python将包含列表的字典对象转换为列表,包括字典

这里是我的问题,我有一个像下面的字典对象:

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

我想将它转换成一个列表包括字典对象是这样的:

[ 
{'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(map(list, zip(configSet['fields'], configSet['results']))) 

但它并没有为我工作。

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

问候。

+0

建议的标题:将单独的标签和值列表为类型的字典列表蟒蛇 – 2013-03-08 12:30:06

回答

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}] 
+0

一个巨大的感谢@Pavel Anossov!这工作正常。 – 2013-03-08 13:08:44

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