将字符串变量读入变量

时间:2015-05-22 09:43:54

标签: python pattern-matching

我有三个关键字%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

它有效,但我发现它很难看。

如何以更好/更好的方式做到这一点?

5 个答案:

答案 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已经存在,只需将结果分配给该变量。