【问题标题】:Convert a string representation of a set of tuples to a dictionary [duplicate]将一组元组的字符串表示形式转换为字典 [重复]
【发布时间】:2019-12-03 12:02:09
【问题描述】:

我有一个代表一组元组的长字符串:

my_string = '{(76034,0),(91316,0),(221981,768),(459889,0),(646088,0)}'

如何将其转换为以下字典?

expected_result = {76034: 0, 91316: 0, 221981: 768, 459889: 0, 646088: 0}

【问题讨论】:

    标签: python dictionary eval


    【解决方案1】:

    如果你对该字符串执行literal_eval,它会返回一个集合。但是,如果您想要 dict,您可以使用 dict() 将其转换为一个:

    In [1]: from ast import literal_eval
    
    In [2]: s = '{(76034,0),(91316,0),(221981,768),(459889,0),(646088,0)}'
    
    In [3]: literal_eval(s)
    Out[3]: {(76034, 0), (91316, 0), (221981, 768), (459889, 0), (646088, 0)}
    
    In [4]: conv_s = literal_eval(s)
    
    In [5]: dict(conv_s)
    Out[5]: {459889: 0, 646088: 0, 221981: 768, 91316: 0, 76034: 0}
    

    【讨论】:

      【解决方案2】:

      您可以在 python 中使用eval 将字符串转换为其对应的数据类型。

      >>> a = '{(76034,0),(91316,0),(221981,768),(459889,0),(646088,0)}'
      >>> eval(a)
      set([(76034, 0), (459889, 0), (646088, 0), (221981, 768), (91316, 0)])
      >>> 
      

      你发布的是一套数据结构。

      或者由于使用 eval 确实有风险,因此您应该像在其他答案中一样使用 ast.literal_eval。另请参阅此答案:[Using python's eval() vs. ast.literal_eval()?

      所以现在代码变成了:

      >>> import ast
      >>> ast.literal_eval(a[1:-1])
      ((76034, 0), (91316, 0), (221981, 768), (459889, 0), (646088, 0))
      >>> 
      

      【讨论】:

      • eval 是邪恶的。
      【解决方案3】:

      尝试使用ast.literal_eval

      import ast
      s = '{(76034,0),(91316,0),(221981,768),(459889,0),(646088,0)}'
      print(dict(ast.literal_eval('[' + s.strip('{}') + ']')))
      

      输出:

      {76034: 0, 91316: 0, 221981: 768, 459889: 0, 646088: 0}
      

      【讨论】:

        猜你喜欢
        • 2021-12-01
        • 2020-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        相关资源
        最近更新 更多