如何使用python创建具有特定值的字典

如何使用python创建具有特定值的字典,python,list,dictionary,Python,List,Dictionary,我有以下两个Python列表 此列表包含一行中的标题 ['id', 'hostname', 'personality', 'action', 'operational', 'availability'] ['| 1 | hostname_1 | master | unlocked | enabled | available |', '| 2 | hostname_2 | slave | unlocked | enabled

我有以下两个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', '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'}}}

您可以使用字典理解和
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}}

首先,我会将您的数据转换为“虚拟CSV文件”,并使用竖条作为分隔符:

data_as_str = "|" + "|".join(titles) + "|\n" + "\n".join(lst)
接下来,将字符串转换为类似文件的对象,并使用CSV女王熊猫读取:

import pandas as pd, io
data = pd.read_csv(io.StringIO(data_as_str), sep="\s*\|\s*", index_col='id')
必须删除一些虚假列(在第一个“|”之前和最后一个“|”之后):

data.drop(['Unnamed: 0','Unnamed: 7'], axis=1, inplace=True)
现在需要做的就是将数据帧转换为字典:

{data.index.name: data.T.to_dict()}
#{'id': {1: {'hostname': 'hostname_1', 'personality': 'master', 
#            'action': 'unlocked',...}

如果您想与3.5之前版本的Python兼容,或者不想使用regex带来的开销,可以使用以下dict:

t = ['id', 'hostname', 'personality', 'action', 'operational', 'availability']
l = ['| 1  | hostname_1           | master  | unlocked       | enabled     | available    |', '| 2  | hostname_2 | slave     | unlocked       | enabled     | available    |', '| 3  | hostname_3 | slave     | unlocked       | enabled     | available    |']
print({t[0]: {i[0]: dict(zip(t[1:], i[1:])) for i in [[v.strip() for v in i.strip('|').split('|')] for i in l]}})
这将产生:

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

我认为通过将列表转换为dict列表而不是建议的格式,可以大大改进您的数据结构,因为
id
键是建议的冗余键。这就是它在典型JSON数组中的表示方式

results = [
    {
        'action': 'unlocked',
        'availability': 'available',
        'hostname': 'hostname_1',
        'id': '1',
        'operational': 'enabled',
        'personality': 'master'
    },{
        'action': 'unlocked',
        'availability': 'available',
        'hostname': 'hostname_2',
        'id': '2',
        'operational': 'enabled',
        'personality': 'slave'
    },{
        'action': 'unlocked',
        'availability': 'available',
        'hostname': 'hostname_3',
        'id': '3',
        'operational': 'enabled',
        'personality': 'slave'
    }
]
至于将字符串解析为列表,您不需要正则表达式或任何花哨的东西,简单的字符串方法就足够了。下面是一个将数据转换为上述结构的函数

def get_list_of_dicts(headers, rows):
    rows = [[i.strip() for i in row.split('|') if i] for row in rows]
    return [{k: v for k, v in zip(headers, row)} for row in rows]

看起来有些磨损,因为最终的结果给了我一个副本keys@Israel根据定义,字典不包含重复的键。你能澄清一下吗?如果你否决了一个被接受的答案,你真的应该留下评论。