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'
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']
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 ]
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)