2015-10-28 15 views
1

我已经阅读了这个论坛上关于这个特定错误的不少其他帖子,但没有什么能真正帮助我解决我的问题。python:ast.literal_eval()给出ValueError:格式错误的字符串

基本上我有这样的事情:

{' 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 

我怎样才能达到预期的效果? 是否可以直接从字典中这样做?

+0

字符串应该用' ''或'“' – thefourtheye

+2

''(ENG,80),(PHY被封闭,65 ),(CHEM,80)''不是一个有效的文字,因为'ENG'和'PHY'和'CHEM'没有被引用,它们不是字符串,它们是Python代码中的*名称,但名称不是字面意思语法 –

回答

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)] 
+0

可爱!演示的+1 – nicki