如何将Unicode列表转换为包含Python字符串的列表?

34

列表的模板如下:

EmployeeList =  [u'<EmpId>', u'<Name>', u'<Doj>', u'<Salary>']

我想要从这里进行转换

EmployeeList =  [u'1001', u'Karick', u'14-12-2020', u'1$']

对于这个:

EmployeeList =  ['1001', 'Karick', '14-12-2020', '1$']

转换后,我实际上是在检查 EmployeeList.values() 中是否存在 "1001"。


这个问题的正确答案取决于您希望在输入包含非ASCII字符时发生什么。如果您希望您的输入全部为ASCII,则将转换抛出异常可以防止将u'Kárick'静默转换为K\xc3\xa1rick(如果您没有预期,这肯定会在下游引起问题)。 - msw
输入是动态的,有时可能包含非ASCII字符,尝试找到最佳解决方案来处理ASCII和非ASCII输入。 - Karthick
4
为什么你想做这件事?只需检查“u"1001"”即可。 - Mark Tolonen
1
为了强调@MarkTolonen的观点,您的数据已经以最佳形式处理Unicode信息。类比于C语言,您可能想将一个int列表转换为short,在大多数情况下这样做是可以的。但当您遇到一个大于short的数据时,您就会引入一个bug。 - msw
是的,你可能对输出要求是正确的。但我不确定在[u <LIST>]中评估u{SearchString}是否是最佳方法。所以考虑将Unicode列表转换为包含字符串的列表,以便与{{SearchString}}进行比较。 - Karthick
9个回答

54

将列表中的每个值编码为字符串:

[x.encode('UTF8') for x in EmployeeList]

你需要选择一个有效的编码;不要使用 str(),因为它将使用系统默认值(对于 Python 2,这是 ASCII),这将无法编码 Unicode 值中的所有可能代码点。

UTF-8 能够编码所有的 Unicode 标准,但是任何 ASCII 范围之外的代码点都会导致每个字符多个字节。

然而,如果你只想测试特定字符串,请测试一个 unicode 字符串,这样 Python 在测试时就不必自动编码所有值:

u'1001' in EmployeeList.values()

鉴于评论中OP的要求澄清,这可能不再是最佳答案。+/-0因为在您编写答案时它是一个很好的答案。 - msw

20

[str(x) for x in EmployeeList]会进行类型转换,但如果Unicode字符串中的字符不在ASCII范围内,则会失败。

>>> EmployeeList = [u'1001', u'Karick', u'14-12-2020', u'1$']
>>> [str(x) for x in EmployeeList]
['1001', 'Karick', '14-12-2020', '1$']


>>> EmployeeList = [u'1001', u'करिक', u'14-12-2020', u'1$']
>>> [str(x) for x in EmployeeList]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

14

我们可以使用 map 函数。

print map(str, EmployeeList)

在Python 2.7中,对于EmployeeList = [u'1001', u'करिक', u'14-12-2020', u'1$']无法正常工作。 - mel
工作得很好...谢谢 - Ajay Kumar

7

只需简单使用此代码即可

EmployeeList = eval(EmployeeList)
EmployeeList = [str(x) for x in EmployeeList]

5

如何:

def fix_unicode(data):
    if isinstance(data, unicode):
        return data.encode('utf-8')
    elif isinstance(data, dict):
        data = dict((fix_unicode(k), fix_unicode(data[k])) for k in data)
    elif isinstance(data, list):
        for i in xrange(0, len(data)):
            data[i] = fix_unicode(data[i])
    return data

0

有几种方法可以实现这个。我是这样转换的

def clean(s):
    s = s.replace("u'","")
    return re.sub("[\[\]\'\s]", '', s)

EmployeeList = [clean(i) for i in str(EmployeeList).split(',')]

之后你可以进行检查

if '1001' in EmployeeList:
    #do something

希望这能对你有所帮助。

0

只需使用json.dumps即可解决问题。

json.dumps函数实际上将所有的unicode文本转换为字符串文本,这样我们就可以轻松地将数据加载到json文件或csv文件中。

示例代码:

import json
EmployeeList =  [u'1001', u'Karick', u'14-12-2020', u'1$']
result_list = json.dumps(EmployeeList)
print result_list

输出:["1001", "Karick", "2020年12月14日", "1美元"]


0
只需使用


unicode_to_list = list(EmployeeList)

0
您可以使用json和ast模块来实现此操作,具体如下:
>>> import json, ast
>>>
>>> EmployeeList =  [u'1001', u'Karick', u'14-12-2020', u'1$']
>>>
>>> result_list = ast.literal_eval(json.dumps(EmployeeList))
>>> result_list
['1001', 'Karick', '14-12-2020', '1$']

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