python:ast.literal_eval()给出ValueError:格式错误的字符串

时间:2015-10-28 10:39:28

标签: python

我在这个论坛上已经阅读了很多关于这个特殊错误的帖子,但没有什么能真正帮助我解决我的问题。

基本上我有这样的事情:

{' Marie ': ' (ENG,80) (PHY,65) (CHEM,80) '} 

我正在尝试将上述内容转换为:

[(ENG,80),(PHY,65),(CHEM,80)] 

这样我就可以访问元组的每个等级并添加它们并返回结果。

到目前为止,我的尝试是:

>>> N={' Marie ': ' (ENG,80) (PHY,65) (CHEM,80) '}
>>> q= N.items()
>>> q
[(' Marie ', ' (ENG,80) (PHY,65) (CHEM,80) ')]
>>> r=N.values()[0]
>>> r
' (ENG,80) (PHY,65) (CHEM,80) '
>>> y=r.strip().split()
>>> y
['(ENG,80)', '(PHY,65)', '(CHEM,80)']
>>> remove=",".join(y)
>>> remove
'(ENG,80),(PHY,65),(CHEM,80)'
>>> list(ast.literal_eval(remove))
ValueError: malformed string

如何达到预期效果? 是否可以直接从字典中这样做?

1 个答案:

答案 0 :(得分:3)

字符串'(ENG,80),(PHY,65),(CHEM,80)'不是有效的Python文字。大概您希望将ENGPHYCHEM视为字符串,但它们不会被引用为有效的Python字符串文字。

手动解析此部分:

N = {' Marie ': ' (ENG,80) (PHY,65) (CHEM,80) '} 
value = N.values()[0]
output = [(token, int(num)) for tup in value.split() for token, num in (tup.strip('()').split(','),)]

演示:

>>> N = {' Marie ': ' (ENG,80) (PHY,65) (CHEM,80) '}
>>> value = N.values()[0]
>>> [(token, int(num)) for tup in value.split() for token, num in (tup.strip('()').split(','),)]
[('ENG', 80), ('PHY', 65), ('CHEM', 80)]