【问题标题】:Converting a string to a nested dictionary将字符串转换为嵌套字典
【发布时间】:2020-05-15 00:15:38
【问题描述】:

我有一个字符串,我想在 Python 中将其转换为嵌套字典。

示例输入:

import copy
diff_str = "/pathConstraint/latency/latencyValue"
value = "low"
diff_arr = diff.split("/")
final_temp_dict = dict()
for elem in reversed(diff_arr):
    if len(final_temp_dict) == 0:
        final_temp_dict.setdefault(elem, value)
    else:
        temp_final_dict = copy.deepcopy(final_temp_dict)
        final_temp_dict.setdefault(elem, temp_final_dict)
    print (final_temp_dict)

在运行此程序时,我遇到了一个错误,并且没有得到预期的输出。

所需的输出是嵌套字典:

{"pathConstraint" : {"latency" : {"latencyValue" : "low"}}}

【问题讨论】:

    标签: python python-3.x string dictionary for-loop


    【解决方案1】:

    更短的递归方法:

    def to_dict(d, v):
      return v if not d else {d[0]:to_dict(d[1:], v)}
    
    
    diff_str = "/pathConstraint/latency/latencyValue"
    value = "low"
    print(to_dict(list(filter(None, diff_str.split('/'))), value))
    

    输出:

    {'pathConstraint': {'latency': {'latencyValue': 'low'}}}
    

    【讨论】:

      【解决方案2】:
      def convert(items, value):
          if not items:
              return value
      
          return {items.pop(0): convert(items, value)}
      
      
      print(convert(diff_str.strip('/').split('/'), 'low'))
      

      【讨论】:

        【解决方案3】:

        我尝试尽可能少地修改你的函数,这应该可以正常工作

        import copy
        def func():
            diff_str = "/pathConstraint/latency/latencyValue"
            value = "low"
            diff_arr = diff_str.split("/")
            final_temp_dict = dict()
            for elem in reversed(diff_arr):
                if elem == "":
                    continue
                if len(final_temp_dict) == 0:
                   final_temp_dict[elem] = value
                else:
                   temp_final_dict = copy.deepcopy(final_temp_dict)
                   final_temp_dict = {}
                   final_temp_dict[elem] = temp_final_dict
        
            print (final_temp_dict)
        

        但是,有很多更好的方法来做这样的事情。查看其他答案以获取灵感。

        【讨论】:

          【解决方案4】:

          以下是一种迭代方法。注意diff_arr[1:]用于排除在初始/上拆分产生的空字符串。

          diff_str = "/pathConstraint/latency/latencyValue"
          value = "low"
          diff_arr = diff_str.split("/")
          for key in list(reversed(diff_arr[1:])):
              value = {key: value}
          print(value)
          

          输出

          {'pathConstraint': {'latency': {'latencyValue': 'low'}}}
          

          【讨论】:

            【解决方案5】:

            您可以使用以下递归函数:

            def string_to_dict(keys, value):
                key = keys.split('/')
                if len(key) == 2:
                    return {key[1]: value}
                else:
                    return string_to_dict('/'.join(key[:-1]), {key[-1]: value})
            

            输出:

            >>> string_to_dict(diff_str, value)
            {'pathConstraint': {'latency': {'latencyValue': 'low'}}}
            

            请注意,这假定 diff_str/ 字符开头。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-02-08
              • 2022-12-05
              • 2020-07-12
              • 2019-07-01
              相关资源
              最近更新 更多