Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将逗号分隔的键值对字符串转换为字典_Python_Python 3.x_Dictionary - Fatal编程技术网

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

Python 将逗号分隔的键值对字符串转换为字典,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我需要将逗号分隔的字符串和以冒号分隔的键值对转换成一个字典,其中的值应该是浮点。我可以这样做来获得口述: >>> 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, 'me

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

>>> 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}
如何强制值浮动

谢谢

那么:

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

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

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}
试试这个:

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}

与第三方熊猫玩耍,您可以使用以下工具:


可能会让人困惑,但您可以尝试以下方法:

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}

这就是如何将其转换为浮点:
float('0.9')
。这是否回答了您的问题?行得通,但可能有些过火——这可以通过理解来实现。一行未必更好(但在这里可能更有效)。不过,在我看来,verbose函数更具可读性。在这样一个简短的代码片段中,当然可以。如果您的
key\u val\u split
函数定义在远离使用它的地方,并且我必须在调试问题时找到它,那么肯定不是。理解都在一个地方,而且总是一起展示。有很多例子表明“一起展示”是一个糟糕的想法。但我们可以同意不同意。当然,我觉得这更具可读性。但我更像是一个功能型的人。虽然这确实有效,但工作过度了。它创建了一个字典来迭代分析浮动-如果您只是使用内部列表,那么实际上没有必要这样做。这是所需迭代次数的两倍。嗯,我有点困惑。你的答案不是在创建一个列表列表,然后迭代来解析浮动吗。这是在哪里创建字典,在哪里我迭代分析浮动?我不明白这是如何有两倍于必要的迭代次数的。你能解释一下我的理解吗?(尽管我同意你的解决方案)当然。它的关键在于,您在s.split(‘,’)中为x创建一个列表,其中包含
x.split(‘:’)
(更具体地说,是一个生成器,但这一区别与本文的讨论关系不大),然后在调用
dict()
(dict(listOfTuples)的实现)中对其进行迭代必须通过迭代使用列表),然后通过
.items()对字典进行迭代。数据有两次完整的迭代。我的只会重复最里面的列表一次。你说得绝对正确。非常感谢您的澄清!
{'us': 0.9, 'can': 1.2, 'mex': 0.45}