将unicode列表转换为包含python字符串的列表的简单方法?

将unicode列表转换为包含python字符串的列表的简单方法?,python,python-2.7,unicode,encoding,Python,Python 2.7,Unicode,Encoding,列表的模板为: EmployeeList = [u'<EmpId>', u'<Name>', u'<Doj>', u'<Salary>'] 为此: EmployeeList = ['1001', 'Karick', '14-12-2020', '1$'] 转换后,我实际上正在检查EmployeeList.values()中是否存在“1001”。[str(x)for x in EmployeeList]将进行转换,但如果unicode字符串字

列表的模板为:

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

EmployeeList =  ['1001', 'Karick', '14-12-2020', '1$']
转换后,我实际上正在检查EmployeeList.values()中是否存在“1001”。

[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)
>>员工名单=[u'1001',u'Karick',u'14-12-2020',u'1$']
>>>[str(x)代表雇员名单中的x]
['1001','Karick','14-12-2020','1$']
>>>员工名单=[u'1001',u'करिक', u'14-12-2020',u'1$']
>>>[str(x)代表雇员名单中的x]
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
UnicodeEncodeError:“ascii”编解码器无法对位置0-3中的字符进行编码:序号不在范围内(128)

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

[x.encode('UTF8') for x in EmployeeList]
您需要选择一个有效的编码;不要使用
str()

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

但是,如果您只想测试特定字符串,那么在测试unicode字符串时,Python不必自动编码所有值:

u'1001' in EmployeeList.values()
那么:

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

我们可以使用
map
函数

print map(str, EmployeeList)

只要简单地使用这个代码

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

unicode_to_list = list(EmployeeList)

有几种方法可以做到这一点。我是这样转变的

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

希望它能对您有所帮助。

您可以通过使用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$']

只要json.dumps就可以解决这个问题

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

示例代码:

导入json
员工名单=[u'1001',u'Karick',u'14-12-2020',u'1$']
result_list=json.dumps(EmployeeList)
打印结果列表

输出:[“1001”、“Karick”、“14-12-2020”、“1$”]

此问题的正确答案取决于您的输入包含非ASCII字符时希望发生的情况。如果您希望您的输入都是ASCII码,那么让转换抛出一个异常可以防止您将
u'Kárick'
静默地转换为
K\xc3\xa1rick
(如果您不期望,这肯定会导致下游出现问题)。输入是动态的,有时可能包含非ASCII字符,试图找到处理ASCII和非ASCII输入的最佳解决方案。为什么要这样做?只需检查
u“1001”
。要放大@MarkTolonen,您的数据已经是处理Unicode信息的最佳形式。与C类似,您可能希望获取
int
的列表,并将其转换为
short
,这样您在大多数情况下都可以。当你碰到一个大于空头的数据时,你只是给自己买了一个bug。是的,也许你对输出要求是正确的。但我不确定在[u]中计算u{SearchString}是否是一种最佳方法。因此,考虑到将unicode列表转换为包含字符串的列表,以便与{{SearchString}}进行比较,鉴于OP在注释中对需求的澄清,这可能不再是最佳答案+/-0,因为您在编写时回答得很好。不适用于EmployeeList=[u'1001',u'करिक', Python 2.7中的u'14-12-2020',u'1$']运行良好…Thnaks
>>> 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$']