如何在列表中去除Unicode

8

我想从列表中删除unicode字符串

例如 airports
[u'KATL',u'KCID']

期望输出

[KATL,KCID]

参考以下链接

Strip all the elements of a string list

尝试其中一种解决方案

my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']

map(str.strip, my_list) ['this', 'is', 'a', 'list', 'of', 'words']

出现以下错误

TypeError: descriptor 'strip' requires a 'str' object but received a 'unicode'


1
我理解你想从字符串中删除 u,是吗?那你可能误解了,这不是你需要删除的东西。它只是表示你正在处理 unicode 字符串而不是字节字符串。这不是你需要解决的问题。 - deceze
3个回答

12

首先,我强烈建议您切换到Python 3,它将Unicode字符串视为一等公民(所有字符串都是Unicode字符串,但称为str)。

但如果你必须在Python 2中运行它,你可以使用unicode.strip(如果你的字符串是真正的Unicode字符串)来去掉unicode字符串:

>>> lst = [u'KATL\n', u'KCID\n']
>>> map(unicode.strip, lst)
[u'KATL', u'KCID']

如果你的unicode字符串仅限于ASCII子集,你可以使用以下方法将它们转换为str

>>> lst = [u'KATL', u'KCID']
>>> map(str, lst)
['KATL', 'KCID']

请注意,此转换不适用于非ASCII字符串。要将Unicode代码点编码为str(字节串),您必须选择编码算法(通常为UTF-8)并在字符串上使用.encode()方法:

>>> lst = [u'KATL', u'KCID']
>>> map(lambda x: x.encode('utf-8'), lst)
['KATL', 'KCID']

尽管我已经尝试了,但我仍然无法将以下代码转换为中文: 124 import pdb 125 pdb.set_trace() 126 # Strip all the elements of a string list 127 map(unicode.strip, airports) 输出结果为: (Pdb++) pp airports [u'KATL'] - Hariom Singh
我没有看到任何错误消息,但我只看到列表仍然具有相同的Unicode。 - Hariom Singh
你实际上想要将Unicode转换为字符串,请尝试答案中的第二个示例map(str, lst) - randomir

3
将unicode字符串转换为字节字符串的唯一可靠方法是将其编码为可接受的编码(ascii、Latin1和UTF8是最常见的编码)。根据定义,UTF8能够编码任何Unicode字符,但您会在字符串中找到非ASCII字符,并且字节大小将不再是(Unicode)字符数。Latin1能够用每个字符一个字节的方式表示大多数西欧语言字符,而ASCII是始终正确表示的字符集。
如果您想能够处理包含无法表示为所选字符集的字符的字符串,则可以使用参数errors = 'ignore'仅删除它们,或者使用errors = 'replace'将它们替换为替换字符,通常为?
因此,如果我正确理解了您的要求,您可以使用以下内容将Unicode字符串列表转换为字节字符串列表:
[ x.encode('ascii', errors='replace') for x in my_list ]

2
一个列表推导式似乎是最简单的解决方案:
[s.strip() for s in my_list]

如果您想使用地图,我建议使用lambda表达式来获取对象自己的个人strip函数,而不是要求它是由特定库提供的strip函数。
map(lambda s: s.strip(), my_list)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接