我在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'}}}
答案 0 :(得分:0)
您可以使用字典理解和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}}
答案 1 :(得分:0)
我首先将您的数据转换为以竖线作为分隔符的“虚拟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',...}
答案 2 :(得分:0)
如果要与3.5之前的Python版本兼容,或者不想使用正则表达式的开销,可以改用以下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'}}}
答案 3 :(得分:0)
我认为,通过将列表转换成字典列表而不是建议的格式,可以大大改善数据结构,因为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]