【问题标题】:Convert a comma separated string of key values pairs to dictionary将逗号分隔的键值对字符串转换为字典
【发布时间】:2019-02-11 04:22:13
【问题描述】:

我需要将一个逗号分隔的字符串和一个用冒号分隔的键值对转换为一个字典,其中的值应该是一个浮点数。我可以这样做以获得一个字典:

>>> s = 'us:0.9,can:1.2,mex:0.45'
>>> dict(x.split(':') for x in s.split(','))

导致:

{'us': '0.9', 'can': '1.2', 'mex': '0.45'}

但不确定如何强制该值不是字符串,即,我期待这个:

{'us': 0.9, 'can': 1.2, 'mex': 0.45}

如何强制数值为浮点数?

谢谢!

【问题讨论】:

标签: python python-3.x dictionary


【解决方案1】:

怎么样:

{k: float(v) for k, v in [i.split(':') for i in s.split(',')]}

【讨论】:

    【解决方案2】:

    您可以为此定义一个函数:

    s = 'us:0.9,can:1.2,mex:0.45'
    
    def key_val_split(L):
        key, val = L.split(':')
        return key, float(val)
    
    res = dict(key_val_split(x) for x in s.split(','))
    
    {'us': 0.9, 'can': 1.2, 'mex': 0.45}
    

    【讨论】:

    • 有效,但可能有点矫枉过正——这可以通过理解内联完成。
    • 一行不一定更好(但在这里可能更有效)。不过,在我看来,verbose 函数更具可读性。
    • 值得商榷。当然,在这样的短代码 sn-p 中。如果你的 key_val_split 函数定义在远离它使用的地方,我必须在调试问题时去找它,那么绝对不会。理解都在一个地方,并且总是一起显示。
    • 很多的例子,其中“一起显示”是一个糟糕的想法。但我们可以同意不同意。当然,我发现这更具可读性。但我更像是一个实用型的人。
    【解决方案3】:

    试试这个:

    s = 'us:0.9,can:1.2,mex:0.45'
    t = {k:float(v) for k, v in dict(x.split(':') for x in s.split(',')).items()}
    print(t)
    

    输出是:

    {'us': 0.9, 'can': 1.2, 'mex': 0.45}
    

    【讨论】:

    • 虽然这确实有效,但它工作过度了。它正在创建一个字典来迭代以解析浮点数 - 如果您只使用内部列表理解,则实际上没有必要这样做。这是所需迭代次数的两倍。
    • 嗯,我有点困惑。您的答案不是创建列表列表并迭代解析浮点数吗?这是在哪里创建字典,我在哪里迭代以解析浮点数?我很困惑这如何有两倍的迭代次数。你能解释一下我的理解吗? (虽然我同意你的解决方案)
    • 当然。它的症结在于您使用x.split(':') for x in s.split(',')(更具体地说,是一个生成器,但这种区别与本次讨论没有太大关系)创建一个列表列表,然后在对dict() 的调用中对其进行迭代( dict(listOfTuples) 的实现必须通过迭代消耗列表),然后通过 .items() 迭代字典。数据有两次完整的迭代。我的只迭代最里面的列表一次。
    • 你说得对。非常感谢您的澄清!
    【解决方案4】:

    与第 3 方 Pandas 一起玩耍,pd.read_csv 可以做很多事情:

    import pandas as pd
    
    s = 'us:0.9,can:1.2,mex:0.45'
    
    d = pd.read_csv(pd.compat.StringIO(s), sep=':', header=None, lineterminator=',')\
          .set_index(0)[1].to_dict()
    
    {'us': 0.9, 'can': 1.2, 'mex': 0.45}
    

    【讨论】:

      【解决方案5】:

      也许它可能会令人困惑,但你可以试试这个:

      s = 'us:0.9,can:1.2,mex:0.45'
      
      dict((a, float(b)) for a,b in [x.split(':') for x in s.split(',')])
      

      输出:

      {'us': 0.9, 'can': 1.2, 'mex': 0.45}
      

      【讨论】:

        猜你喜欢
        • 2019-01-23
        • 2015-07-13
        • 2015-05-20
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多