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

Converting a list of unicode objects to a list of strings

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

您需要对子列表使用 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)