2017-03-01 19 views
1

であれば、私は混合STRとUnicode文字列を持つことができ、リストをしたユニコードにリスト項目を変換しますパイソン - 項目は文字列

lst = ['string1', u'string2', 'string3', u'string4'] 

項目がstrのであれば、私はユニコード内のすべてのリスト項目を変換する必要があります。 unicodeにSTRを変換するために私が使用します。

s = s.decode('utf-8') 

問題である文字列がすでにユニコードであり、私はそれを解読しようとした場合、非ASCII文字が含まれている場合、私はUnicodeEncodeErrorをを得ること:「ASCII」コーデックことができます」トンエンコード文字...

はので、私は何か考えた:

lst = [i.decode('utf-8') for i in lst if isinstance(i, str)] 

をしかし、これは実際には、リストからUnicode文字列を削除します。

+0

あなたは、Unicode文字列をコピーするには、 'else'を追加することができます。 – pushkin

+2

おそらく、そのビジネスを落として、Unicodeの組み込みサポートを備えたPython 3.xに移行し、すべての文字列がデフォルトでUnicodeになっているので、 'unicode'タイプはありません。 – ForceBru

+0

あなたは実際にUTF-8を解読する必要がありますか、あるいはあなたの 'str'文字列は本当にASCIIだけですか? –

答えて

4

を。あなたの代わりにconditional expressionを使用する必要があります。

lst = [i.decode('utf-8') if isinstance(i, str) else i for i in lst] 

ここ<true> if <condition> else <false>式は常に、出力を生成します。ここにはデコードされた文字列があり、元のオブジェクトはstrオブジェクトでなければ変更されません。

4

これを試してください:あなたは(非マッチング要素を取り除く)フィルタリングしている

lst = [i.decode('utf-8') if isinstance(i, str) else i for i in lst ] 
0

あなたは私の意見では、別のヘルパー関数にロジックを抽出するためにきれいになり、正しく要素を変換するために、あなたのリスト内包での三元表現を使用することができますが:

def convert_to_unicode(s): 
    """ 
    convert `s` to unicode. If `s` is already 
    unicode, return `s` as is. 
    """ 
    if isinstance(s, str): 
     return s.decode('utf-8') 
    else: 
     return s 

その後、あなたは、単に呼び出すことができますあなたのリストの各要素に対して機能:

lst = [convert_to_unicode(i) for i in lst] 
関連する問題