【问题标题】:Easy way to convert a unicode list to a list containing python strings?将Unicode列表转换为包含Python字符串的列表的简单方法?
【发布时间】:2013-08-18 18:52:24
【问题描述】:

列表模板为:

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(如果您不期望它肯定会导致下游问题)。
  • 输入是动态的,有时可能包含非 ASCII 字符,试图找到处理 ASCII 和非 ASCII 输入的最佳解决方案。
  • 为什么要这样做?只需检查u"1001"
  • 为了放大@MarkTolonen,您的数据已经处于处理 Unicode 信息的最佳形式。与 C 类比,您可能想要获取int 的列表并将它们转换为short,并且您可能大部分时间都很好。当你击中一个大于空头的基准时,你只是给自己买了一个错误。
  • 是的,您可能对输出要求是正确的。但我不确定在 [u ] 中评估 u{SearchString} 是否是一种最佳方法。因此想到将 unicode 列表转换为包含字符串的列表以与 {{SearchString}} 进行比较

标签: python python-2.7 unicode encoding


【解决方案1】:

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

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

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

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

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

u'1001' in EmployeeList.values()

【讨论】:

  • 鉴于 OP 在 cmets 中的要求澄清,这可能不再是最佳答案。 +/-0,因为当你写它时它是一个很好的答案。
【解决方案2】:

[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)

【讨论】:

    【解决方案3】:

    我们可以使用map函数

    print map(str, EmployeeList)
    

    【讨论】:

    • 在 Python 2.7 中不适用于 EmployeeList = [u'1001', u'करिक', u'14-12-2020', u'1$']
    • 工作得很好......谢谢
    【解决方案4】:

    只需使用此代码

    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
      

      【讨论】:

        【解决方案6】:

        随便用

        unicode_to_list = list(EmployeeList)
        

        【讨论】:

          【解决方案7】:

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

          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
          

          希望对你有帮助。

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

              只需 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", "14-12-2020", "1$"]

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-08-11
                • 2015-09-18
                • 1970-01-01
                • 2022-10-23
                • 2020-08-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多