2012-03-05 13 views
11
x = ['Some strings.', 1, 2, 3, 'More strings!', 'Fanc\xc3\xbf string!'] 
y = [i.decode('UTF-8') for i in x] 

¿Cuál es la mejor manera de convertir las cadenas en x en Unicode? Hacer una compresión de lista causa un error de atributo (AttributeError: 'int' object has no attribute 'decode') porque los int no tienen un método de decodificación.En Python, ¿cómo convierto una lista de enter y cadenas a Unicode?

Podría usar un bucle for con una prueba? O podría hacer una comprobación explícita de tipos en la compresión de listas, pero ¿es la comprobación de tipos en un lenguaje dinámico como Python el enfoque correcto?

ACTUALIZACIÓN:

yo preferiría que los de int permanecen de int. Aunque este no es un requisito estricto. Mi salida ideal sería [u'Some strings.', 1, 2, 3, u'More strings!', u'Fancÿ string!'].

+4

¿Cuál es su salida deseada se pone? '[u'Some strings ', 1, 2, 3, u'More strings!']', '[u'Some strings ', u'1', u'2 ', u'3', u'More strings ! '] ',' [u'Some strings', u'More strings! '] '? –

Respuesta

11

Si desea mantener los números enteros ya que están en la lista, mientras que sólo el cambio de las cadenas a Unicode, se puede hacer

x = ['Some strings.', 1, 2, 3, 'More strings!'] 
y = [i.decode('UTF-8') if isinstance(i, basestring) else i for i in x] 

que

[u'Some strings.', 1, 2, 3, u'More strings!'] 
+0

También podría hacer esto usando un ciclo y un bloque try/catch, pero creo que esto es más ordenado. – cjm

+2

El bloque try/catch funcionaría en objetos que tienen un método de decodificación, pero no son instancias de bases. Que conserva una característica de los lenguajes dinámicos: no tiene que hacer una gran cantidad de comprobación de tipos y herencia elegante. – Buttons840

+0

Sí, es un compromiso entre brevedad y programación utilizando la filosofía dinámica. En mi opinión, generalmente debe evitar el uso de try/catch para controlar el flujo, si puede ayudarlo, pero ambas soluciones podrían ser apropiadas dependiendo de su mentalidad/situación. – cjm

11

usted podría utilizar la función unicode:

>>> x = ['Some strings.', 1, 2, 3, 'More strings!'] 
>>> y = [unicode(i) for i in x] 
>>> y 
[u'Some strings.', u'1', u'2', u'3', u'More strings!'] 

ACTUALIZACIÓN: ya se ha indicado que desea que los números enteros a permanecer como está, me gustaría utilizar esto:

>>> y = [unicode(i) if isinstance(i, basestring) else i for i in x] 
>>> y 
[u'Some strings.', 1, 2, 3, u'More strings!'] 

Nota: como señala @Boldewyn, si desea UTF-8, debe pasar el parámetro encoding a la función Unicode:

unicode(i, encoding='UTF-8') 
+1

Esto solo funciona para ASCII (el 'decode()' está ahí para un propósito). Y convierte los números para escribir 'unicode'. – Boldewyn

+0

Esto también funciona para Unicode, no solo ASCII. – jterrace

+0

* Solo * si le dice al intérprete de Python mediante '- * - codificación - * -' pragmas. Y Unicode! = UTF-8, lo siento. – Boldewyn

Cuestiones relacionadas