我几次遇到过这个问题,似乎无法找到一个简单的解决方案。 说我有一个字符串
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方法可以帮我做到这一点?
答案 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语法生成它并将其除去即可。 但是,当然你应该执行额外的健全性检查,以确保没有注入代码!