2017-01-09 5 views
0

ユニコードオブジェクトのリストnamesがあります。新しいリストparsed_namesを生成しようとしています.1つの名前を持つオブジェクトが文字列に変換され、名前のリスト文字列のリストに変換されます。他のユニコードオブジェクトのリストを文字列のリストに変換する

names = [u'Johnny', u'["Tamir", "Josh"]', u'Brad'] 
parsed_names = ['Johnny', ['Tamir', 'Josh'], 'Brad'] 

次のコードは、トリックを行いますが、私はむしろ場合にエラー(ValueError: malformed string)をキャッチしていないと思います何か間違って行くことにした。

import ast 

names = [u'Johnny', u'["Tamir", "Josh"]', u'Brad'] 
parsed_names = [] 

for n in names: 
    try: 
     parsed_names.append(ast.literal_eval(name)) 
    except ValueError: 
     parsed_names.append(str(name)) 

print parsed_names 
# ['Johnny', ['Tamir', 'Josh'], 'Brad'] 

注:私の最終的なゴア私は平らなリスト(['Johnny', 'Tamir', 'Josh', 'Brad'])を作成することですが、私はすでにそのためのコードを持っており、私はこのステップを最初に取らなければならないと考えています。

+0

次に、すべて仕事しています –

+0

@PatrickHaugh彼は最初に文字列を評価しているので、リストのように見える文字列はリストに評価されます。きれいに評価されないものはすべて文字列として保持されます。 – onlynone

+0

各文字列を評価するだけで問題に遭遇します。誰かの名前が "True"の場合、あなたは最終的なリストに追加されたブール値「True」を取得します。組み込みまたは予約語と一致する「名前」はすべて問題になります。 – onlynone

答えて

1

あなたは、サブリストのextendの代わりappendを使用する必要があります。

import ast 

parsed_names = [] 
for n in names: 
    try: 
     sub_list = ast.literal_eval(n) 
     parsed_names.extend(sub_list) 
    except ValueError: 
     parsed_names.append(str(n)) 

出力:

>>> parsed_names 
['Johnny', 'Tamir', 'Josh', 'Brad'] 

をごtry..exceptを使用したくない場合は、次のことを試すことができます。

temp = [ast.literal_eval(n) if '[' in n else str(n) for n in names] 
# ['Johnny', ['Tamir', 'Josh'], 'Brad'] 

res = [] 

for item in temp: 
    if isinstance(item, list): 
     res.extend(item) 
    else: 
     res.append(item) 
+0

素晴らしい!これは私の2番目の質問を解決しますが、私はまだエラーをキャッチすることを心配しています。もし他の 'ValueError'が起きたら、それは発生しません –

+0

@ jcmetz21私の編集した答えを見てください。 – ettanany

関連する問題