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] 

xの文字列をUnicodeに変換する最適な方法は何ですか? intのデコードメソッドがないため、リスト圧縮を行うと属性エラー(AttributeError: 'int' object has no attribute 'decode')が発生します。Pythonでは、intとstringのリストをUnicodeに変換するにはどうしたらいいですか?

私は試しにforループを使用できますか?あるいは、リスト圧縮で明示的な型チェックを行うこともできますが、Pythonのような動的言語の型チェックは正しい方法ですか?

更新:

intの値はintのままです。これは厳しい要件ではありませんが。私の理想的な出力は[u'Some strings.', 1, 2, 3, u'More strings!', u'Fancÿ string!']です。

+4

ご希望の出力は何になります

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!'] '、' [u'Some strings '、u'1'、u'2 '、u'3'、u'more strings ! '] '、' [u'Some strings'、u'More strings! '] '? –

答えて

11

あなたは、彼らがリストにあるとして、整数を維持したい場合は、あなたが

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

ループとtry/catchブロックを使用してこれを行うこともできますが、これはちょっと考えています。 – cjm

+2

try/catchブロックは、デコードメソッドを持つオブジェクトでは機能しますが、ベースストリングのインスタンスではありません。これは動的言語の機能を保持します。タイプチェックやファンシーな継承を行う必要はありません。 – Buttons840

+0

ええ、それは簡潔さと動的哲学を使ったプログラミングの間の妥協点です。私はあなたがそれを助けることができるならば、あなたが一般的にフローコントロールのためにtry/catchを使うのを避けるべきですが、あなたの考え方/状況に応じてどちらの解決策も適切かもしれません。 – cjm

11

あなたはunicode機能を使用できます。UPDATE

>>> 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!'] 

を:

>>> 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に文字列を変更しながら
+1

これは、ASCIIの場合にのみ機能します(目的のために 'decode()'があります)。そして、数字を「unicode」に変換します。 – Boldewyn

+0

これはASCIIだけでなくユニコードでも機能します。 – jterrace

+0

* Pythonインタプリタに ' - * - coding - * - 'プラグマを介して伝える場合にのみ*。そして、Unicode!= UTF-8、申し訳ありません。 – Boldewyn

関連する問題