Python:ast.literal_eval() 函数出现 ValueError: 无效字符串错误

3

我在本论坛上读过一些关于这个特定错误的帖子,但是没有什么能真正帮助我解决问题的。

基本上,我的情况是这样的:

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

我该如何达到期望的结果?是否可以直接从字典中实现?


字符串应该用 '" 包围。 - thefourtheye
3
'(ENG,80),(PHY,65),(CHEM,80)' 不是一个有效的字面量,因为 ENGPHYCHEM 没有加引号。它们不是字符串,在 Python 代码中它们是 名称,但名称不是字面量语法。 - Martijn Pieters
我是一个新手,所以我不明白为什么你的例子不是字面值。难道字面值不是用引号括起来的吗?是什么例外使这不是字面值 '(ENG,80),(PHY,65),(CHEM,80)' - geekandglitter
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接