2015-10-28 41 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