2012-03-05 33 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

相关问题