【问题标题】:Get proper list from list of unicode list从 unicode 列表中获取正确的列表
【发布时间】:2018-11-27 07:21:34
【问题描述】:

我有一个列表形式的 unicode 字符串列表。

my_list = [u'[James, Williams, Kevin, Parker, Alex, Emma, Katie\xa0, Annie]']

我想要一个可以迭代的列表,例如;

name_list = [James, Williams, Kevin, Parker, Alex, Emma, Katie, Annie]

我已经尝试了几种可能的解决方案here,但在我的情况下它们都不起作用。

# Tried
name_list =  name_list.encode('ascii', 'ignore').decode('utf-8')

#Gives unicode return type

# Tried
ast.literal_eval(name_list)

#Gives me invalid token error

【问题讨论】:

  • 如果你只是学习Python,你应该忽略Python 2。目前支持和推荐的语言版本是Python 3。
  • name_list = [James, Williams... 在 Python 中是非法的。你想要的是name_list = ['James', 'Williams'...

标签: python list unicode unicode-escapes


【解决方案1】:

首先,列表没有encode 方法,您必须对列表中的项目应用任何字符串方法。

其次,如果您正在考虑规范化字符串,您可以使用 Python 的 unicodedata 库中的 normalize 函数,阅读更多 here,这将删除不需要的字符 '\xa0',并将帮助您规范化任何其他字符人物。

然后不要使用通常不安全的eval,而是使用列表推导来构建列表:

import unicodedata

li = [u'[James, Williams, Kevin, Parker, Alex, Emma, Katie\xa0, Annie]']
inner_li = unicodedata.normalize("NFKD", li[0]) #<--- notice the list selection

#get only part of the string you want to convert into a list
new_li = [i.strip() for i in inner_li[1:-1].split(',')] 
new_li
>> ['James', 'Williams', 'Kevin', 'Parker', 'Alex', 'Emma', 'Katie', 'Annie']

在您的预期输出中,它们实际上是一个变量列表,除非之前声明,否则会给您一个错误。

【讨论】:

    【解决方案2】:

    这是一个很好的正则表达式应用:

    import re
    body = re.findall(r"\[\s*(.+)\s*]", my_list[0])[0] # extract the stuff in []s
    names = re.split("\s*,\s*", body) # extract the names
    #['James', 'Williams', 'Kevin', 'Parker', 'Alex', 'Emma', 'Katie', 'Annie']
    

    【讨论】:

    • 嗯,为什么这是正则表达式的好应用?如果输入是正常的,只需names = value.strip('[]').split(', ')
    • @tripleee 对于初学者,您的解决方案不会删除“\xa0”。作为后续,正则表达式会处理逗号和括号前后所有可能的杂散空格。最后,欢迎您单独发布您的答案。
    • 如果输入不是常规的,为什么\xa0是我们特别担心的?其他垃圾和错别字呢?无论如何,这个问题太不清楚了,不值得回答恕我直言。
    • @tripleee 首先,因为 OP 明确要求将其删除。其次,因为\xa0 一个空格,而我的解决方案确实删除了所有空格。
    【解决方案3】:
    import unicodedata
    
    lst = [u'[James, Williams, Kevin, Parker, Alex, Emma, Katie\xa0, Annie]']
    lst = unicodedata.normalize("NFKD", lst[0])
    lst2 = lst[1:-1].split(", ") # remove open and close brackets
    print(lst2)
    

    输出将是:

    ["James", "Williams", "Kevin", "Parker", "Alex", "Emma", "Katie ", "Annie"]
    

    如果您想删除所有前导/尾随空格的空格:

    lst3 = [i.strip() for i in lst2]
    print(lst3)
    

    输出将是:

    ["James", "Williams", "Kevin", "Parker", "Alex", "Emma", "Katie", "Annie"]
    

    【讨论】:

    • 在 lst2 = list[0][1:-1].split(", ") 上面试过,但它给出了“列表索引超出范围”的错误。
    • 是的,我也试过了。我使用了正确的变量名。
    • 对不起,它现在工作了。!!谢谢你。不知道为什么第一次运行它会出错。但它给了我一个 unicode 名称列表,[u'James', u'Williams', u'Kevin', u'Parker', u'Alex', u'Emma', u'Katie\xa0', u'安妮']。在打印“Katie\xa0”时会抛出 UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0'
    • @Rachel 你可以使用unicodedata.normalize,正如 BernardL 提到的那样。 lst[0] = unicodedata.normalize("NFKD", lst[0])
    • 我添加了更多解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2015-11-11
    相关资源
    最近更新 更多