我也碰到这个问题来了几次,似乎无法找出一个简单的解决方案。 说我有一个字符串
string = "a=0 b=1 c=3"
我想将其转换成具有,b和c是所述键和0,1和3被它们各自的值(转换为int)的字典。 很显然,我可以这样做:
list = string.split()
dic = {}
for entry in list:
key, val = entry.split('=')
dic[key] = int(val)
但我真的不喜欢那个for循环,它似乎很简单,你应该能够将其转换为某种形式的名单理解的表达。 这适用于稍微简单的情况下val
可以是一个字符串。
dic = dict([entry.split('=') for entry in list])
不过,我需要为val转换为对飞一个int,做这样的事情是语法不正确。
dic = dict([[entry[0], int(entry[1])] for entry.split('=') in list])
所以我的问题是:是否有消除使用列表理解循环的方法吗? 如果没有,是否有一些内置的python方法会为我做的?
Answer 1:
你的意思呢?
>>> dict( (n,int(v)) for n,v in (a.split('=') for a in string.split() ) )
{'a': 0, 'c': 3, 'b': 1}
Answer 2:
如何不列表中理解一个班轮?
foo="a=0 b=1 c=3"
ans=eval( 'dict(%s)'%foo.replace(' ',',')) )
print ans
{'a': 0, 'c': 3, 'b': 1}
Answer 3:
尝试下:
dict([x.split('=') for x in s.split()])
Answer 4:
我有时像这种方法,特别是当用于制造键和值的逻辑是更复杂的:
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()))
Answer 5:
现在你应该使用字典理解,在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
Answer 6:
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}
Answer 7:
我这样做:
def kv(e): return (e[0], int(e[1]))
d = dict([kv(e.split("=")) for e in string.split(" ")])
Answer 8:
我喜欢美国洛特的解决方案,但我想出了另一种可能性。
既然你已经有一个字符串类似不知为何,你会写的方式,你可以使其适应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语法只是生成它和eval它拿走。 当然,你应该进行额外的完整性检查,以确保没有任何代码注入那里!
文章来源: convert string to dict using list comprehension