2017-01-09 167 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