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

Jaki jest najlepszy sposób na konwersję ciągów w x na Unicode? Wykonanie kompresji listy powoduje błąd atrybutu (AttributeError: 'int' object has no attribute 'decode'), ponieważ int nie ma metody dekodowania.W Pythonie, w jaki sposób przekonwertować listę elementów i ciągów znaków na kod Unicode?

Mogę użyć pętli for przy próbie? Czy mogę zrobić wyraźne sprawdzanie typu w kompresji listy, ale czy sprawdzanie typu w dynamicznym języku, takim jak Python, właściwym podejściem?

UPDATE:

Wolałbym, int pozostają INT. Chociaż nie jest to ścisłe wymaganie. Moją idealną wydajnością będzie [u'Some strings.', 1, 2, 3, u'More strings!', u'Fancÿ string!'].

+4

Jaki jest Twój sygnał wyjściowy? '[u'Some stringi ', 1, 2, 3, u'Więcej ciągów!']', '[u'Some stringi ', u'1', u'2 ', u'3', u'Więcej ciągów ! '] ',' [u'Some stringi', u'More napisy! '] '? –

Odpowiedz

11

Jeśli chcesz zachować całkowite, ponieważ są one na liście, podczas gdy po prostu zmieniając ciągi Unicode, można zrobić

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

który dostaje

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

Można to również zrobić za pomocą pętli i bloku try/catch, ale uważam, że jest bardziej uporządkowany. – cjm

+2

Blok try/catch działałby na obiektach, które mają metodę dekodowania, ale nie są instancjami łańcucha bazowego. Który zachowuje cechę języków dynamicznych: nie musisz robić wiele sprawdzania typu i fantazyjnego dziedziczenia. – Buttons840

+0

Tak, to kompromis między zwięzłością a programowaniem przy użyciu dynamicznej filozofii. Jestem przekonany, że generalnie należy unikać używania funkcji prób/catch do kontroli przepływu, jeśli możesz pomóc, ale oba rozwiązania mogą być odpowiednie w zależności od twojego nastawienia/sytuacji. – cjm

11

Można użyć unicode funkcję:

>>> 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: skoro podano, że chcesz całkowitymi pozostanie jak jest, chciałbym użyć tego:

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

Uwaga: jak @Boldewyn wskazuje, jeśli chcesz UTF-8, powinieneś przekazać parametr encoding do funkcji Unicode:

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

Działa to tylko dla ASCII ('decode()' jest w tym celu). I konwertuje liczby, aby wpisać 'unicode'. – Boldewyn

+0

Działa to również dla Unicodu, nie tylko ASCII. – jterrace

+0

* Tylko * jeśli mówisz interpreterowi Python przez '- * - coding - * -' pragmas. I Unicode! = UTF-8, przepraszam. – Boldewyn

Powiązane problemy