如何将字符串列表转换为python中的字典列表?

时间:2016-11-26 20:16:12

标签: python string list dictionary

我有一个格式为的字符串:

["('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自己的函数或至少不使用循环,但我不知道这是否可行。

5 个答案:

答案 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.subjson.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)

正如@ n​​exus66建议的那样,这里是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)