我有三个关键字%vel
,%note
,%blah
,我想从字符串解析为整数:
s = "%vel=127, %note=64, %blah=13"
# should give { 'vel': 127, 'note': 64, 'blah': 13}
# or vel = 127 // note = 64 // blah = 13
或
s = "%blah=5,%note=44"
# should give { 'blah': 5, 'note': 44}
我做过类似的事情:
s = "%vel=127, %note=64, %blah=13"
d = dict()
for k in s.split(','):
k = k.strip()
if "%vel" in k: d['vel'] = int(k.split("%vel=")[1])
if "%note" in k: d['note'] = int(k.split("%note=")[1])
if "%blah" in k: d['blah'] = int(k.split("%blah=")[1])
print d
它有效,但我发现它很难看。
如何以更好/更好的方式做到这一点?
答案 0 :(得分:4)
真正快速的列表理解示例:
s = "%blah=5, %note=44"
print dict([item.split('=') for item in s.replace(' ','').replace('%', '').split(',')])
s = "%blah=5, %note=44"
# existing dict
old_dict_with_data = { ... }
result = dict(map(lambda x: [x[0], int(x[1])], [item.split('=') for item in s.replace(' ', '').replace('%', '').split(',')]))
old_dict_with_data.update(result)
我建议将这些理解内容分成几个操作,因为我承认它看起来不太可读:(
请随意填写,我会解释
答案 1 :(得分:2)
使用正则表达式非常容易:
示例:强>
>>> from re import findall
>>> s = "%vel=127, %note=64, %blah=13"
>>> m = findall("%([a-z]+)=([0-9]+)", s)
>>> d = dict(m)
>>> d
{'note': '64', 'blah': '13', 'vel': '127'}
您甚至可以将整数值转换为正确的int
:
>>> dict((k, int(v)) for k, v in m)
{'note': 64, 'blah': 13, 'vel': 127}
答案 2 :(得分:2)
不知道为什么没有人在做词典理解。
>>> s = "%blah=5, %note=44"
>>> {k: int(v) for k, v in (item[1:].split('=') for item in s.split(', '))}
{'note': 44, 'blah': 5}
编辑:对于格式错误的案例:
>>> s = "%vel=127, %note=64, %blah=13"
>>> {k: int(v) for k, v in (item.strip()[1:].split('=') for item in s.split(','))}
{'vel': 127, 'note': 64, 'blah': 13}
答案 3 :(得分:0)
为什么不使用列表理解?
key_val_list = [k.strip().split('=') for k in s.split(',')]
for item in key_val_list:
d[item[0][1:]] = int(item[1])
答案 4 :(得分:0)
In [101]: dict(map(lambda v: v.replace('%','').split('='), map(str.strip, s.split(','))))
Out[101]: {'blah': '13', 'note': '64', 'vel': '127'}
如果您的dict
已经存在,只需将结果分配给该变量。