将逗号分隔的键值对字符串转换为字典

4
我需要将一个由冒号分隔的键值对组成的逗号分隔字符串转换为一个字典,其中值应该是浮点数。我可以通过以下方式得到一个字典:
>>> 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}

如何强制数值为浮点数?
谢谢!

这是将其转换为浮点数的方法:float('0.9') - Muzol
这个回答解决了你的问题吗?在Python中将分号分隔的字符串拆分为字典 - Tomerikoo
5个回答

16

怎么样:

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

1
也许会有些困惑,但你可以尝试这个:

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}

0
你可以为此定义一个函数:
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}

可以工作,但可能过于复杂 - 这可以使用推导式内联完成。 - g.d.d.c
1
一行代码不一定更好(但在这里可能更有效率)。然而,在我看来,冗长的函数更易读。 - jpp
1
有争议。在像这样的短代码片段中,可以肯定。如果您的key_val_split函数定义在远离使用它的地方,并且我在调试问题时必须去找它,那么绝对不行。理解都在一个地方,并且总是一起显示。 - g.d.d.c
1
有很多例子表明,“一起显示”是一个糟糕的想法。但我们可以同意不同意。当然,我认为这更易读。但我更倾向于函数式编程。 - jpp

0

试试这个:

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}

2
虽然这个方法可以工作,但是它有些过度。它创建了一个字典来迭代解析浮点数 - 如果您只消耗内部列表推导式,那么实际上并不需要这样做。这比必要的迭代次数多了一倍。 - g.d.d.c
嗯,我有点困惑。你的答案不是创建了一个列表的列表,并迭代解析浮点数吗?而这个是创建字典,我迭代解析浮点数?我对这个为什么需要两倍的迭代次数感到困惑。你能解释一下让我理解吗?(虽然我同意你的解决方案) - shahbazkhan
1
当然。关键在于使用x.split(':') for x in s.split(',')创建一个列表的列表(更具体地说,是生成器,但这种区别对本讨论并不是非常重要),然后在调用dict()时迭代它(通过迭代来消耗dict(listOfTuples)的实现必须消耗列表),然后通过.items()迭代字典。数据有两个完整的迭代。我的只迭代了最内层的列表一次。 - g.d.d.c
你说得完全正确。非常感谢你的澄清! - shahbazkhan

0

玩弄第三方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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接