Получить правильный список из списка Unicode списка - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть список со строкой Unicode в форме списка.

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

Мне нужен список, который я могу перебирать, например:

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

Iпопробовал несколько возможных решений, приведенных здесь , но ни одно из них не сработало в моем случае.

# 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

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Во-первых, у списка нет метода encode, вы должны применить любые строковые методы к элементу в списке.

Во-вторых, если вы смотрите на нормализацию строки, вы можете использоватьфункция normalize из библиотеки Python unicodedata, подробнее здесь , она удаляет нежелательные символы '\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']

В ожидаемом результате они на самом деле представляют собой список переменных, которыеесли не объявлено ранее, вы получите ошибку.

0 голосов
/ 27 ноября 2018

Это хорошее приложение для регулярных выражений:

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']
0 голосов
/ 27 ноября 2018
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"]
...