我有一个格式为的字符串:
["('colA':'datA1', 'colB':'datB1', 'colC':'datC1')",
"('colA':'datA2', 'colB':'datB2', 'colC':'datC2')",
..........
"('colA':'datAn', 'colB':'datBn', 'colC':'datCn')]
我需要获得一个字典:
[{'colA': 'datA1', 'colB': 'datB1', 'colC': 'datC1'},
{'colA': 'datA2', 'colB': 'datB2', 'colC': 'datC2'},
..........
{'colA': 'datAn', 'colB': 'datBn', 'colC': 'datCn'}]
如果可能,我需要使用Python自己的函数或至少不使用循环,但我不知道这是否可行。
答案 0 :(得分:8)
用大括号替换括号并使用ast.literal_eval
:
import ast
l = ["('colA':'datA1', 'colB':'datB1', 'colC':'datC1')",
"('colA':'datA2', 'colB':'datB2', 'colC':'datC2')",
"('colA':'datAn', 'colB':'datBn', 'colC':'datCn')"]
result = [ast.literal_eval('{%s}' % item[1:-1]) for item in l]
结果:
>>> import pprint
>>> pprint.pprint(result)
[{'colA': 'datA1', 'colB': 'datB1', 'colC': 'datC1'},
{'colA': 'datA2', 'colB': 'datB2', 'colC': 'datC2'},
{'colA': 'datAn', 'colB': 'datBn', 'colC': 'datCn'}]
答案 1 :(得分:2)
避免使用eval
(因为它不安全)功能并依赖正确的dict结构(在 json 表示中)。对re.sub
和json.loads
函数使用以下方法:
import json, re
d = ["('colA':'datA1', 'colB':'datB1', 'colC':'datC1')",
"('colA':'datA2', 'colB':'datB2', 'colC':'datC2')",
"('colA':'datAn', 'colB':'datBn', 'colC':'datCn')"]
try:
l = [json.loads('{' + re.sub(r'\'', '"', s).strip('()') + '}') for s in d]
print(l)
except json.decoder.JSONDecodeError as err:
print('JSONDecodeError: ', err)
输出:
[{'colC': 'datC1', 'colA': 'datA1', 'colB': 'datB1'}, {'colC': 'datC2', 'colA': 'datA2', 'colB': 'datB2'}, {'colC': 'datCn', 'colA': 'datAn', 'colB': 'datBn'}]
答案 2 :(得分:2)
正如@ nexus66建议的那样,这里是that answer的更精简版本:
l = ["('colA':'datA1', 'colB':'datB1', 'colC':'datC1')",
"('colA':'datA2', 'colB':'datB2', 'colC':'datC2')",
"('colA':'datAn', 'colB':'datBn', 'colC':'datCn')"]
result = [dict(
item.replace("'", '').split(':')
for item in s[1:-1].split(', ')
)
for s in l]
答案 3 :(得分:1)
我的问题解决方案,无需导入任何模块:
my_input = ["('colA':'datA1', 'colB':'datB1', 'colC':'datC1')",
"('colA':'datA2', 'colB':'datB2', 'colC':'datC2')",
"('colA':'datAn', 'colB':'datBn', 'colC':'datCn')"]
global_list =[]
for i in my_input:
intern_dict = {}
for j in i.replace("(", "").replace(")", "").split(","):
c = j.split(":")
intern_dict["".join(c[0].replace("'", "").strip())] = "".join(c[1].replace("'","").strip())
global_list.append(intern_dict)
print("Type of global_list: {0}\n".format(type(global_list)))
print(global_list)
print("\nType of elements inside global_list\n")
for i in global_list:
print("{0}\tType: {1}".format(i, type(i)))
输出:
Type of global_list: <class 'list'>
[{'colA': 'datA1', 'colC': 'datC1', 'colB': 'datB1'}, {'colA': 'datA2', 'colC': 'datC2', 'colB': 'datB2'}, {'colA': 'datAn', 'colC': 'datCn', 'colB': 'datBn'}]
Type of elements inside global_list
{'colA': 'datA1', 'colC': 'datC1', 'colB': 'datB1'} Type: <class 'dict'>
{'colA': 'datA2', 'colC': 'datC2', 'colB': 'datB2'} Type: <class 'dict'>
{'colA': 'datAn', 'colC': 'datCn', 'colB': 'datBn'} Type: <class 'dict'>
答案 4 :(得分:-2)
使用json,
import json
lst = "yourstringhere"
dict = json.load(lst)