首页 > 解决方案 > 如何在python中创建具有某些值的字典

问题描述

我在 Python 中有以下两个列表

此列表包含一行中的标题

['id', 'hostname', 'personality', 'action', 'operational', 'availability']

此列表包含一行中的数据

['| 1  | hostname_1           | master  | unlocked       | enabled     | available    |', '| 2  | hostname_2 | slave     | unlocked       | enabled     | available    |', '| 3  | hostname_3 | slave     | unlocked       | enabled     | available    |']

到目前为止,我还没有找到遍历两个列表以获得以下结果的方法

{'id': {'1': {'action': 'unlocked',
              'availability': 'available',
              'hostname': 'hostname_1',
              'operational': 'enabled',
              'personality': 'master'},
        '2': {'action': 'unlocked',
              'availability': 'available',
              'hostname': 'hostname_2',
              'operational': 'enabled',
              'personality': 'slave'},
        '3': {'action': 'unlocked',
              'availability': 'available',
              'hostname': 'hostname_3',
              'operational': 'enabled',
              'personality': 'slave'}}}

标签: pythonlistdictionary

解决方案


您可以使用字典理解和re

import re
_start, *header = ['id', 'hostname', 'personality', 'action', 'operational', 'availability']
data = ['| 1  | hostname_1           | master  | unlocked       | enabled     | available    |', '| 2  | hostname_2 | slave     | unlocked       | enabled     | available    |', '| 3  | hostname_3 | slave     | unlocked       | enabled     | available    |']
new_data = [re.findall('\w+', i) for i in data]
final_results = {_start:{a:dict(zip(header, b)) for a, *b in new_data}}

输出:

{'id': {'1': {'hostname': 'hostname_1', 'personality': 'master', 'action': 'unlocked', 'operational': 'enabled', 'availability': 'available'}, '2': {'hostname': 'hostname_2', 'personality': 'slave', 'action': 'unlocked', 'operational': 'enabled', 'availability': 'available'}, '3': {'hostname': 'hostname_3', 'personality': 'slave', 'action': 'unlocked', 'operational': 'enabled', 'availability': 'available'}}}

编辑:没有 Python3.x 解包:

import re
headers = ['id', 'hostname', 'personality', 'action', 'operational', 'availability']
data = ['| 1  | hostname_1           | master  | unlocked       | enabled     | available    |', '| 2  | hostname_2 | slave     | unlocked       | enabled     | available    |', '| 3  | hostname_3 | slave     | unlocked       | enabled     | available    |']
new_data = [re.findall('\w+', i) for i in data]
final_results = {headers[0]:{i[0]:dict(zip(header, i[1:])) for i in new_data}}

推荐阅读