Python - 如果item是string,则将列表项转换为unicode

时间:2017-03-01 17:17:35

标签: python string unicode

我有一个可以混合str和unicode字符串的列表:

lst = ['string1', u'string2', 'string3', u'string4']

如果项目是str,我需要转换unicode中的每个列表项。要将str转换为unicode,我使用:

s = s.decode('utf-8')

问题是如果字符串已经是unicode并且包含非ascii字符,如果我尝试解码它,我会得到UnicodeEncodeError:' ascii'编解码器不能编码字符...

所以我想的是:

lst = [i.decode('utf-8') for i in lst if isinstance(i, str)]

但实际上这会从列表中删除unicode字符串。

3 个答案:

答案 0 :(得分:4)

试试这个:

lst = [i.decode('utf-8') if isinstance(i, str) else i for i in lst ]

答案 1 :(得分:4)

您正在过滤(删除不匹配的元素);您需要使用conditional expression代替:

lst = [i.decode('utf-8') if isinstance(i, str) else i for i in lst]

此处的<true> if <condition> else <false>表达式始终生成输出。这是解码后的字符串,如果原始对象不是str对象,则原始对象不变。

答案 2 :(得分:0)

虽然您可以在列表解析中使用三元表达式来正确转换元素,但在我看来,将逻辑提取到单独的辅助函数会更清晰:

def convert_to_unicode(s):
    """
    convert `s` to unicode. If `s` is already
    unicode, return `s` as is.
    """
    if isinstance(s, str):
        return s.decode('utf-8')
    else:
        return s

然后,您只需在列表的每个元素上调用该函数:

lst = [convert_to_unicode(i) for i in lst]