将unicode对象列表转换为字符串列表

时间:2017-01-09 19:02:46

标签: python unicode abstract-syntax-tree

我有一个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']),但我已经有了代码,我认为必须先执行此步骤。

1 个答案:

答案 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)