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

Qual è il modo migliore per convertire le stringhe in x in Unicode? La compressione di una lista causa un errore di attributo (AttributeError: 'int' object has no attribute 'decode') perché int non ha un metodo di decodifica.In Python, come posso convertire un elenco di interi e stringhe in Unicode?

Potrei usare un ciclo for con una prova? Oppure potrei fare un controllo esplicito del tipo nella compressione della lista, ma il tipo controlla in un linguaggio dinamico come Python l'approccio giusto?

UPDATE:

io preferirei che i int di rimangono Int di. Anche se questo non è un requisito rigoroso. Il mio output ideale sarebbe [u'Some strings.', 1, 2, 3, u'More strings!', u'Fancÿ string!'].

+4

Qual è il suo output desiderato ottiene? '[u'Alcuni archi ', 1, 2, 3, uI più archi!']', '[u'Alcuni archi ', u'1', u'2 ', u'3', u'Altre corde ! '] ',' [u'Alcuni archi', u 'Altri archi!'] '? –

risposta

11

Se si desidera mantenere i numeri interi come sono nella lista, mentre solo modificando le stringhe in unicode, si può fare

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

cui si

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

Si potrebbe anche fare ciò usando un ciclo e un blocco try/catch, ma penso che questo sia più ordinato. – cjm

+2

Il blocco try/catch funzionava su oggetti che hanno un metodo di decodifica, ma non sono esempi di basestring. Che conserva una funzionalità dei linguaggi dinamici: non è necessario eseguire molti tipi di controllo e eredità di fantasia. – Buttons840

+0

Sì, è un compromesso tra brevità e programmazione usando la filosofia dinamica. Sono del parere che in generale dovresti evitare di usare try/catch per il controllo del flusso se puoi aiutarlo, ma entrambe le soluzioni potrebbero essere appropriate a seconda della tua situazione mentale. – cjm

11

è possibile utilizzare la funzione 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!'] 

UPDATE: da quando è stato specificato che si desidera che i numeri interi di rimanere così come sono, vorrei utilizzare questo:

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

Nota: come sottolinea @Boldewyn, se vuoi UTF-8, devi passare il parametro encoding alla funzione unicode:

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

Funziona solo per ASCII (il 'decode()' è lì per uno scopo). E converte i numeri per digitare 'unicode'. – Boldewyn

+0

Anche per Unicode, non solo ASCII. – jterrace

+0

* Solo * se si dice all'interprete Python tramite '- * - coding - * -' pragmas. E Unicode! = UTF-8, mi dispiace. – Boldewyn

Problemi correlati