使用list comprehension将字符串转换为dict

时间:2009-08-07 19:00:32

标签: python string dictionary list-comprehension generator-expression

我几次遇到过这个问题,似乎无法找到一个简单的解决方案。 说我有一个字符串

string = "a=0 b=1 c=3"

我想将其转换为字典,其中a,b和c为键,0,1和3为各自的值(转换为int)。显然我可以这样做:

list = string.split()
dic = {}
for entry in list:
    key, val = entry.split('=')
    dic[key] = int(val)

但是我并不喜欢循环,看起来很简单,你应该能够将它转换成某种列表理解表达式。这适用于val可以是字符串的稍微简单的情况。

dic = dict([entry.split('=') for entry in list])

但是,我需要动态地将val转换为int,并且做这样的事情在语法上是不正确的。

dic = dict([[entry[0], int(entry[1])] for entry.split('=') in list])

所以我的问题是:有没有办法使用列表理解来消除for循环?如果没有,是否有一些内置的python方法可以帮我做到这一点?

8 个答案:

答案 0 :(得分:29)

你是说这个吗?

>>> dict( (n,int(v)) for n,v in (a.split('=') for a in string.split() ) )
{'a': 0, 'c': 3, 'b': 1}

答案 1 :(得分:3)

没有列表理解的单行程怎么样?

 foo="a=0 b=1 c=3"
 ans=eval( 'dict(%s)'%foo.replace(' ',',')) )
 print ans
{'a': 0, 'c': 3, 'b': 1}

答案 2 :(得分:3)

尝试下一个:

dict([x.split('=') for x in s.split()])

答案 3 :(得分:2)

我有时喜欢这种方法,特别是当制作键和值的逻辑更复杂时:

s = "a=0 b=1 c=3"

def get_key_val(x):
    a,b = x.split('=')
    return a,int(b)

ans = dict(map(get_key_val,s.split()))

答案 4 :(得分:2)

现在你应该使用2.7:

中介绍的词典理解
mydict = {key: int(value) for key, value in (a.split('=') for a in mystring.split())}

字典理解更快更有光泽(在我看来,更具可读性)。

from timeit import timeit

setup = """mystring = "a=0 b=1 c=3\""""
code1 = """mydict = dict((n,int(v)) for n,v in (a.split('=') for a in mystring.split()))""" # S.Lott's code
code2 = """mydict = {key: int(value) for key, value in (a.split('=') for a in mystring.split())}"""

print timeit(code1, setup=setup, number=10000) # 0.115524053574
print timeit(code2, setup=setup, number=10000) # 0.105328798294

答案 5 :(得分:1)

from cgi import parse_qsl
text = "a=0 b=1 c=3"
dic = dict((k, int(v)) for k, v in parse_qsl(text.replace(' ', '&')))
print dic

打印

{'a': 0, 'c': 3, 'b': 1}

答案 6 :(得分:0)

我会这样做:

def kv(e): return (e[0], int(e[1]))
d = dict([kv(e.split("=")) for e in string.split(" ")])

答案 7 :(得分:-3)

我喜欢S.Lott的解决方案,但我提出了另一种可能性 因为你已经有一个类似于你编写方式的字符串,你可以将它改编为python语法然后eval()它:)

import re
string = "a=0 b=1 c=3"
string2 = "{"+ re.sub('( |^)(?P<id>\w+)=(?P<val>\d+)', ' "\g<id>":\g<val>,', string) +"}"
dict = eval(string2)
print type(string), type(string2), type(dict)
print string, string2, dict

这里的正则表达式非常原始,不会捕获所有可能的python标识符,但为了简单起见,我想保持简单。 当然,如果您可以控制输入字符串的生成方式,只需根据python语法生成它并将其除去即可。 但是,当然你应该执行额外的健全性检查,以确保没有注入代码!