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

將x中的字符串轉換爲Unicode的最佳方式是什麼?執行列表壓縮會導致屬性錯誤(AttributeError: 'int' object has no attribute 'decode'),因爲int沒有解碼方法。在Python中,如何將整數和字符串列表轉換爲Unicode?

我可以使用for循環與嘗試?或者我可以在列表壓縮中做一些明確的類型檢查,但是用類似Python的動態語言進行類型檢查是正確的方法嗎?

UPDATE:

我寧願整型的保持廉政的。雖然這不是一個嚴格的要求。我的理想輸出是[u'Some strings.', 1, 2, 3, u'More strings!', u'Fancÿ string!']

+4

什麼是你想要的輸出? ''有些琴絃',1,2,3,u'More琴絃!']''''有些琴絃',u'1',u'2',u'3',u'更多琴絃!']','[''有些琴絃','更多琴絃!']'? – 2012-03-05 17:35:53

回答

11

如果你想保留整數,因爲它們在列表中,而只是改變了字符串轉換爲Unicode,你可以做

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

它讓你

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

你也可以使用循環和try/catch塊來做到這一點,但我認爲這是更整潔。 – cjm 2012-03-05 17:47:51

+2

try/catch塊可用於具有解碼方法的對象,但不是basestring的實例。它保留了動態語言的特性:您不必進行大量的類型檢查和花式繼承。 – Buttons840 2012-03-05 18:14:27

+0

是的,這是使用動態哲學簡潔和編程之間的妥協。我很想知道,如果你能夠提供幫助,你通常應該避免使用try/catch來進行流量控制,但根據你的想法/情況,這兩種解決方案都可能是合適的。 – cjm 2012-03-05 20:18:17

11

您可以使用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:既然你指定你想要的整數保持原樣,我會用這樣的:

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

注意:正如@Boldewyn所指出的,如果你想要UTF-8,你應該將encoding參數傳遞給unicode函數:

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

這隻適用於ASCII('decode()'是出於某種目的)。它將數字轉換爲「unicode」類型。 – Boldewyn 2012-03-05 17:37:50

+0

這也適用於unicode,而不僅僅是ASCII。 – jterrace 2012-03-05 17:38:54

+0

*僅*如果您通過' - * - coding - * - 'pragmas告訴Python解釋器。而Unicode!= UTF-8,對不起。 – Boldewyn 2012-03-05 17:39:50

相關問題