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

python:ast.literal_eval()给出了ValueError:格式错误的字符串,python,Python,我已经在这个论坛上读了很多关于这个错误的帖子,但是没有任何东西真正帮助我解决我的问题 基本上我有这样的东西: {' Marie ': ' (ENG,80) (PHY,65) (CHEM,80) '} 我试图将上述内容转换为: [(ENG,80),(PHY,65),(CHEM,80)] 这样我就可以访问元组的每个等级,将它们相加并返回结果 到目前为止,我的努力是: >>> N={' Marie ': ' (ENG,80) (PHY,65) (CHEM,80) '} >

我已经在这个论坛上读了很多关于这个错误的帖子,但是没有任何东西真正帮助我解决我的问题

基本上我有这样的东西:

{' 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
我怎样才能达到预期的结果? 是否可以直接从字典中执行此操作?

字符串
'(ENG,80)、(PHY,65)、(CHEM,80)
不是有效的Python文本。您可能希望将
ENG
PHY
CHEM
视为字符串,但它们不会被引用为有效的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(','),)]
演示:


字符串应该用
'
'
'(英语,80),(物理,65),(化学,80)括起来“
不是有效的文字,因为
ENG
PHY
CHEM
没有被引用。它们不是字符串,它们在Python代码中是名称,但名称不是文字语法。我是新手,所以我不明白为什么您的示例不是文字。文字不是被括在引号中吗?造成这种情况的例外是什么这不是一个字面意义上的
'(英语,80),(物理,65),(化学,80)
可爱!+1用于演示
>>> 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)]