我有一个unicode对象列表names
,我试图生成一个新列表parsed_names
,以便将具有单个名称的对象转换为字符串,并将具有列表的对象转换为名称转换为字符串列表:
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']
注意:我的最终目标是生成一个扁平列表(['Johnny', 'Tamir', 'Josh', 'Brad']
),但我已经有了代码,我认为必须先执行此步骤。
答案 0 :(得分: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)