【问题标题】:How could I convert this formatted string into a key, value dictionary form?如何将此格式化字符串转换为键值字典形式?
【发布时间】:2018-04-25 04:22:21
【问题描述】:

我不太确定如何将格式化的字符串转换为字典,我的想法是将我的字符串分成两个列表,然后将它们加入字典,但我相信必须有一种方法来转换它直接从字符串到字典。

这是我目前得到的:

字符串:

'Me_of_temp_max: 13.91 Me_of_temp_min: 11.33 Me_of_p_max: 14.25 Me_of_p_min: 14.53'

我正在寻找的是:

{'Me_of_temp_max': 13.91, 'Me_of_temp_min': 11.33, 'Me_of_p_max': 14.25, 'Me_of_p_min': 14.53}

但我所做的是:

items = {}


result = ['Me_of_temp_max', 'Me_of_temp_min', 'Me_of_p_ma', 'Me_of_p_min']
result1 = [13.91, 11.33, 14.25, 14.53]
for i in range(len(result)):
        items[result[i]] = result1[i]
return items

【问题讨论】:

  • 你的字典里的数值是从哪里来的? 13.91 怎么变成 18.38?
  • 来自格式化操作?这很重要吗?
  • 嗯,是的,因为我不知道你从字符串 '13.91' 到 int 18.38 的逻辑是什么,所以我无法为你提供解决方案。
  • 鉴于数字不知从何而来——是的,描述它们背后的原因很重要......
  • 哦,我明白了...抱歉,这是打字错误。它们必须是完全相同的值。对不起

标签: python string dictionary


【解决方案1】:

使用splitreplace 处理字符串并使用zip 构建dictionary 的简单的两个衬垫:

>>> t = s.replace(':','').split()
>>> dict( zip(t[::2], list(map(float,t[1::2]))) )

#driver 值:

IN : s = 'Me_of_temp_max: 13.91 Me_of_temp_min: 11.33 Me_of_p_max: 14.25 Me_of_p_min: 14.53'
OUT : {'Me_of_temp_max': 13.91, 'Me_of_temp_min': 11.33, 'Me_of_p_max': 14.25, 'Me_of_p_min': 14.53}

进一步解释:

  1. replace 函数用于删除字符串中的所有':',因为它们不是必需的。
  2. 以空格为分隔符的split 函数为我们提供了包含键和值的列表。
  3. zip 函数为dict 创建key-value
    • 并且由于keys 位于偶数位置,我们通过将extended slicing 用作[::2] 来获得所需的列表。
    • 并且由于values 位于奇数位置,我们通过将extended slicing 用作[1::2] 来获得所需列表。由于值应该是 float,我们使用 map 来获取包含浮点值的列表。
  4. 最后type-cast它到dict

【讨论】:

    【解决方案2】:

    这个怎么样:

    input = "Me_of_temp_max: 13.91 Me_of_temp_min: 11.33 Me_of_p_max: 14.25 Me_of_p_min: 14.53"
    
    spl = input.split("Me") 
    spl_noempty = [("Me"+x).strip().split(':') for x in spl if x != ''] 
    
    dic = dict(spl_noempty)
    print(dic)
    

    我在Me 拆分,删除空格。我再次添加Me 并在: 处拆分每个部分以形成一个元组列表,然后dict 它们。

    【讨论】:

      【解决方案3】:

      您希望拆分 (space),然后迭代这些值。

      s = 'Me_of_temp_max: 13.91 Me_of_temp_min: 11.33 Me_of_p_max: 14.25 Me_of_p_min: 14.53'
      
      s_key_vals = s.replace(':', '').split(' ')
      
      res = {}
      for idx, key in enumerate(s_key_vals):
          if idx % 2 == 0: # will be an even number, every time ``idx`` is even, it means key is a value like: ``Me_of_temp_min`` or ``Me_of_p_min`` etc
              res[key] = float(s_key_vals[idx+1])  # Convert the number to a float instead of being left with a string.
      

      返回:{'Me_of_temp_min': 11.33, 'Me_of_p_min': 14.53, 'Me_of_temp_max': 13.91, 'Me_of_p_max': 14.25}

      【讨论】:

        【解决方案4】:

        这是一种使用正则表达式的方法,这意味着您可能需要更改它以适应数据的确切格式。

        import re
        
        s = 'Me_of_temp_max: 13.91 Me_of_temp_min: 11.33 Me_of_p_max: 14.25 Me_of_p_min: 14.53'
        regex = re.compile('(\w+):\s(\d+\.\d+)')
        {k: float(v) for k, v in regex.findall(s)}
        

        输出:

        {'Me_of_p_max': 14.25,
         'Me_of_p_min': 14.53,
         'Me_of_temp_max': 13.91,
         'Me_of_temp_min': 11.33}
        

        【讨论】:

          【解决方案5】:

          你可以使用 `string.split(' ')' 和后者来处理 ':'。这样,您就有了一个列表,其中偶数和奇数位置包含键和数字(作为字符串)。

          【讨论】:

            猜你喜欢
            • 2019-01-08
            • 2021-08-21
            • 2022-11-10
            • 1970-01-01
            • 1970-01-01
            • 2020-03-26
            • 2010-11-02
            相关资源
            最近更新 更多