Python将字符串转换为字典

Posted

技术标签:

【中文标题】Python将字符串转换为字典【英文标题】:Python Convert string to dict 【发布时间】:2018-05-19 17:10:34 【问题描述】:

我有一个字符串:

'tomatoes : 5 , livestock :cow : 5 , sheep :2 ' 

并想将其转换为


  "tomatoes" : "5" , 
  "livestock" :""cow" : "5" , "sheep" :"2" "

有什么想法吗?

【问题讨论】:

您是否有理由希望将数字捕获为字符串? 不一定,我想这样可能更容易。 这有点悖论。您不能真正将字符串更改为字典类型......这不像您可以将类型更改为dict。这很有趣,我想知道它是如何发挥作用的...... JSON 是一种有用的方式,但是暴力硬编码方式怎么样? 那是一本格式怪异的字典。它是从哪里来的? 这来自 Mac 应用程序。我需要将其转换为真正的 python dict 以便更快地访问。 【参考方案1】:

你有一个 JSON 格式的字符串,你想将它转换成 python 字典。

使用 JSON 库:

import json
with open("your file", "r") as f:
    dictionary =  json.loads(f.read());

现在字典包含你正在寻找的数据结构。

【讨论】:

注意 OPs 字符串不是有效的 JSON。 键和值未声明为字符串【参考方案2】:

你的输入字符串的问题在于它实际上不是一个有效的 JSON,因为你的键没有被声明为字符串,否则你可以使用 json 模块来加载它并完成它。

获得所需内容的一种简单而肮脏的方法是首先通过在不是空格或语法字符的所有内容周围添加引号将其转换为有效的 JSON:

source = 'tomatoes : 5 , livestock :cow : 5 , sheep :2 '

output = ""
quoting = False
for char in source:
    if char.isalnum():
        if not quoting:
            output += '"'
            quoting = True
    elif quoting:
        output += '"'
        quoting = False
    output += char

print(output)  #  "tomatoes" : "5" , "livestock" :"cow" : "5" , "sheep" :"2" 

这为您提供了一个有效的 JSON,因此您现在可以使用 json 模块轻松地将其解析为 Python dict

import json

parsed = json.loads(output)
# 'livestock': 'sheep': '2', 'cow': '5', 'tomatoes': '5'

【讨论】:

为什么是 json?为什么不只是parsed = eval(output) @innisfree - 因为任何理智的人都不应该使用eval。即使是疯子在使用它之前也应该三思而后行......然后使用ast.literal_eval(),如果他们真的,真的找不到任何方法来解决它。此外,它比json.loads()很多 @innisfree - 以Eval really is dangerous 开头,然后使用evaldangerousbad practiceslow 等字词进行搜索,您将获得更多信息而不是你不应该使用它的一大堆理由。简而言之 - 在 99.999% 的可能用例中,有一个更快、更好、更安全的解决方案,而不会使您的系统面临使用 eval() 运行任意代码的危险。 您没有将系统暴露给任意代码,而是一段非常特殊的代码,即'tomatoes: 5, livestock: cow: 5, sheep: 2' @innisfree - 这只是一个例子,OP 已经通过输入问题将该字符串转换为他想要的任何内容。可以安全地假设它将用于 OP 控制之外的任意字符串(否则他/她可以强加最适合他们的格式)并且您不希望 eval() 接触任意字符串(这就是为什么大多数人无论如何都想使用eval())。【参考方案3】:

这是我的答案:

dict_str = 'tomatoes: 5, livestock: cow: 5, sheep: 2'

def dict_from_str(dict_str):    

    while True:

        try:
            dict_ = eval(dict_str)
        except NameError as e:
            key = e.message.split("'")[1]
            dict_str = dict_str.replace(key, "''".format(key))
        else:
            return dict_


print dict_from_str(dict_str)

我的策略是通过eval 将字典str 转换为dict。但是,我首先必须处理您的字典键未包含在引号中的事实。我通过无论如何评估它并捕捉错误来做到这一点。从错误消息中,我提取了被解释为未知变量的键,并用引号将其括起来。

【讨论】:

我不确定破解错误信息是愚蠢还是聪明:D 人们往往对使用eval 很敏感,请记住ast 模块中有一个名为literal_eval 的函数,它的评估范围大大缩小,因此更安全. @paul haha​​ 是的,我注意到了 ;)【参考方案4】:

这已经解决在988251 简而言之;使用 python ast 库的 literal_eval() 函数。

import ast
my_string = "'key':'val','key2':2"
my_dict = ast.literal_eval(my_string)

【讨论】:

它有效,但要小心,这会改变字典顺序 请使用@mwaks给出的数据再试一次 哇,太棒了。谢谢你,先生

以上是关于Python将字符串转换为字典的主要内容,如果未能解决你的问题,请参考以下文章

Python将字符串转换为字典

python-将字符串转换为字典

如何将不带引号的嵌套字符串字典转换为Python中的字典

python-将字符串转换为字典

将字符串转换为字典 python

Python 怎么将列表类字典组字符串转换为列表?