2017-09-08 15 views
0

私は、PythonでいくつかのJSONブロブと要素をループすることでリストを構築しています。時には要素が単一であり、時には二重(またはそれ以上)であることもあります。私は['a', '1', 'b', '1', 'c1', 'c2']を得る代わりに拡張を使用する場合リストにN> = 1要素を追加する

my_list = []  
for j in jsons: 
    my_list.append(j['foo']) 

my_list['a1', 'b1', ['c1', 'c2']]

なってしまいます。

私が追加しているものがリストであるかどうかを確認してから、それを要素ごとに追加する必要がありますか?それとも既にこれを行うより良い機能がありますか?

+6

あなたのJSONブロブの不合理な不規則性を考慮すると、明示的なチェックは十分に妥当であるようです。しかし、リストであるかどうかをチェックし、 '.extend'、それ以外の場合は' .append'をチェックします。もう一つのアプローチは、後で平らにすることですが、チェックするのが一番でしょう。 –

+0

データが一貫して整理されていないのはなぜですか?おそらく、それを作成するコードを修正することができます。 – Barmar

+0

私は@Barmarができそうですが、それは政府が提供する公開データです。 – ScottieB

答えて

3

はい、各アイテムタイプを明示的にチェックする必要があります。

例えば

、あなたが書くことができます。

# sample jsons 
jsons = [{'foo': 'a1'}, 
     {'foo': 'b1'}, 
     {'foo': ['c1', 'c2']}] 

my_list = [] 
for json in jsons: 
    item = json['foo'] 
    if isinstance(item, list): 
     my_list.extend(item) 
    else: 
     my_list.append(item) 

あなたが得る:

['a1', 'b1', 'c1', 'c2'] 

しかし、パイソンとあなたは簡単にするためにternary conditional expressionを使用することができます。

あなたが使用することができます
my_list = [] 
for json in jsons: 
    item = json['foo'] 
    my_list.extend(item if isinstance(item, list) else [item]) 
+0

また、三項式を使用して正しい呼び出し方法を選択することもできます。これにより、 'item'をラップする一時的なリストを作成しなくて済みます。 '(mylist.extend if isinstance(item、list)else mylist.append)(item)'を実行します。 – chepner

+0

あなたは正しく、これは珍しいと高度な使用法と考えることができます... ;-) –

2

singledispatchデコレータを使用して、メインループの定型文の一部を移動します。デコレータはPython 3.4以降の標準ライブラリのfunctoolsモジュールから、またはPyPiのsingledispatchモジュールから入手できます。

これは、(最初​​の)引数のタイプによって異なる動作をするadder関数を定義します。

@singledispatch 
def adder(item): 
    mylist.append(item) 

@adder.register(list) 
def _(item): 
    mylist.extend(item) 

mylist = [] 
for json in jsons: 
    adder(json['foo']) 
関連する問題