2017-01-09 161 views
0

我有一個unicode對象列表names,我試圖創建一個新列表parsed_names,以便將具有單個名稱的對象轉換爲字符串並將對象轉換爲名單被轉換成字符串列表:將unicode對象列表轉換爲字符串列表

names = [u'Johnny', u'["Tamir", "Josh"]', u'Brad'] 
parsed_names = ['Johnny', ['Tamir', 'Josh'], 'Brad'] 

下面的代碼做的伎倆,但我寧願不捉,以防別的錯誤(ValueError: malformed string)當中去錯了:

import ast 

names = [u'Johnny', u'["Tamir", "Josh"]', u'Brad'] 
parsed_names = [] 

for n in names: 
    try: 
     parsed_names.append(ast.literal_eval(name)) 
    except ValueError: 
     parsed_names.append(str(name)) 

print parsed_names 
# ['Johnny', ['Tamir', 'Josh'], 'Brad'] 

注意:我的最後goa我將生成一個扁平列表(['Johnny', 'Tamir', 'Josh', 'Brad']),但我已經有了這個代碼,我想這一步必須先採取。

+0

然後代碼贏得' t一點也不工作 –

+0

@PatrickHaugh他首先評估字符串,這樣看起來像列表的字符串將被評估爲列表。沒有乾淨評估的所有東西都將保持爲字符串。 – onlynone

+0

您將通過評估每個字符串來解決問題。如果某人的姓名是「True」,那麼您將會將布爾值「True」添加到您的最終列表中。任何匹配內建或保留字的「名稱」都會有問題。 – onlynone

回答

1

您需要使用extend而不是append的子列表:

import ast 

parsed_names = [] 
for n in names: 
    try: 
     sub_list = ast.literal_eval(n) 
     parsed_names.extend(sub_list) 
    except ValueError: 
     parsed_names.append(str(n)) 

輸出:

>>> parsed_names 
['Johnny', 'Tamir', 'Josh', 'Brad'] 

如果你不想使用try..except,你可以嘗試以下方法:

temp = [ast.literal_eval(n) if '[' in n else str(n) for n in names] 
# ['Johnny', ['Tamir', 'Josh'], 'Brad'] 

res = [] 

for item in temp: 
    if isinstance(item, list): 
     res.extend(item) 
    else: 
     res.append(item) 
+0

太好了!這解決了我的第二個問題,但我仍然擔心發現錯誤。如果發生一些其他的'ValueError',它不會被提出 –

+0

@ jcmetz21請看看我編輯的答案。 – ettanany