web-dev-qa-db-fra.com

Comment supprimer unicode dans une liste

Je veux supprimer la chaîne Unicode de la liste Par exemple aéroports [u'KATL ', u'KCID']

production attendue

[KATL, KCID]

Suivi le lien ci-dessous

Supprimer tous les éléments d'une liste de chaînes

Essayé de la solution

my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']

map (str.strip, my_list) ['this', 'est', 'a', 'list', 'of', 'words']

a l'erreur suivante

TypeError: le descripteur 'strip' nécessite un objet 'str' mais reçoit un 'unicode'

6
Hariom Singh

Premièrement, je vous suggère fortement de passer à Python 3, qui traite les chaînes Unicode comme des citoyens de première classe (toutes les chaînes sont des chaînes Unicode, mais elles sont appelées str).

Mais si vous devez le faire fonctionner en Python 2, vous pouvez effacer les chaînes unicode avec unicode.strip (si vos chaînes sont de véritables chaînes Unicode):

>>> lst = [u'KATL\n', u'KCID\n']
>>> map(unicode.strip, lst)
[u'KATL', u'KCID']

Si vos chaînes unicode sont limitées à un sous-ensemble ASCII, vous pouvez les convertir en str avec:

>>> lst = [u'KATL', u'KCID']
>>> map(str, lst)
['KATL', 'KCID']

Notez que cette conversion échouera pour les chaînes non-ASCII. Pour coder des points de code Unicode en tant que str (chaîne d'octets), vous devez choisir votre algorithme de codage (généralement UTF-8) et utiliser la méthode .encode() sur vos chaînes:

>>> lst = [u'KATL', u'KCID']
>>> map(lambda x: x.encode('utf-8'), lst)
['KATL', 'KCID']
9
randomir

La seule solution fiable pour convertir une chaîne unicode en chaîne d'octets consiste à encoder dans un encodage acceptable (ascii, Latin1 et UTF8 étant les plus courants). Par définition, UTF8 est capable de coder n’importe quel caractère unicode, mais vous trouverez des caractères non ascii dans la chaîne et la taille en octet ne sera plus le nombre de caractères (unicode). Latin1 est capable de représenter la plupart des caractères des langues d’Europe occidentale avec une relation de 1 octet par caractère, et ascii est l’ensemble des caractères qui sont toujours correctement représentés.

Si vous voulez pouvoir traiter des chaînes contenant des caractères non représentables dans le jeu de caractères choisi, vous pouvez utiliser le paramètre errors='ignore' pour les supprimer ou errors='replace' pour les remplacer par un caractère de remplacement, souvent ?.

Donc, si j'ai bien compris votre exigence, vous pouvez traduire la liste de chaînes Unicode en une liste de chaînes d'octets avec:

[ x.encode('ascii', errors='replace') for x in my_list ]
1
Serge Ballesta

Un listcomp semble la solution la plus simple:

[s.strip() for s in my_list]

Si vous souhaitez utiliser une carte, j'utiliserais un lambda pour obtenir la fonction strip personnelle de l'objet plutôt que d'exiger que ce soit la strip fournie par une bibliothèque particulière. 

map(lambda s: s.strip(), my_list)
1
Jon Kiparsky