【问题标题】:How can I convert string to dict or list?如何将字符串转换为字典或列表?
【发布时间】:2015-06-25 02:48:34
【问题描述】:

我有这样的字符串:

'[1, 2, 3]'

"{'a': 1, 'b': 2}"

如何将它们转换为列表/字典?

有人提到ast.literal_evaleval 可以解析转换为list/dict的字符串。

ast.literal_evaleval 有什么区别?

【问题讨论】:

    标签: python string list python-2.7 dictionary


    【解决方案1】:

    将此字符串转换为 dict 的 python 脚本:-

    import json
    
    inp_string = '{"1":"one", "2":"two"}'
    out = json.loads(inp_string)
    print out["1"]
    

    O/P 就像:

    "one"
    

    【讨论】:

      【解决方案2】:

      您可以通过ast.literal_eval()eval() 函数将字符串转换为列表/字典。 ast.literal_eval() 只认为 Python 语法的一小部分是有效的:

      提供的字符串或节点只能由以下 Python 组成 文字结构:字符串、数字、元组、列表、字典、布尔值、 和无。

      __import__('os').system('rm -rf /') 传递给ast.literal_eval() 会引发错误,但eval() 会愉快地擦除您的驱动器。

      由于您似乎只允许用户输入普通字典,因此请使用 ast.literal_eval()。它可以安全地做您想做的事,仅此而已。

      【讨论】:

        【解决方案3】:

        ast.literal_eval 解析“抽象语法树”。你几乎在那里有 json,你可以使用 json.loads,但你需要双引号,而不是单引号,字典键才有效。

        import ast
        
        result = ast.literal_eval("{'a': 1, 'b': 2}")
        assert type(result) is dict
        
        result = ast.literal_eval("[1, 2, 3]")
        assert type(result) is list
        

        另外,这没有eval 的风险,因为它不涉及评估函数的业务。 eval("subprocess.call(['sudo', 'rm', '-rf', '/'])") 可以删除您的根目录,但 ast.literal_eval("subprocess.call(['sudo', 'rm', '-rf', '/'])") 可以预见地失败,您的文件系统完好无损。

        【讨论】:

          【解决方案4】:

          您可以eval(),但只能使用安全数据。否则,如果您解析不安全的数据,请查看更安全的ast.literal_eval()

          JSON解析器也是一种可能,大多数python dicts和lists语法相同。

          【讨论】:

            【解决方案5】:

            使用 eval 函数:

            l = eval('[1, 2, 3]')
            
            d = eval("{'a':1, 'b': 2}")
            

            只要确保您知道这些字符串的来源,并且您不允许评估用户输入并做一些恶意的事情。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-01-10
              • 2013-10-11
              • 2011-07-12
              • 2014-05-23
              • 2019-05-29
              相关资源
              最近更新 更多