2017-10-02 14 views
2

私は辞書のリストを持っています(JSONレスポンス)。各辞書には、文字列のリストを含むキーと値のペアが含まれています。私はこれらの文字列をネストされたfor-loopを使って処理していますが、これはうまく動作します。JSONレスポンスを処理する際にネストされたループが必要ですか?

しかし、productメソッドを使用して、2つのfor-loopsを1つのループにまとめることができるかどうかは疑問でした。明らかに、定義されていないので、範囲変数にループ変数aを使用することはできません。

データを複数回反復することなくこれを行う方法はありますか?

from itertools import product 

dicts = [ 
    { 
     'key1': 'value1', 
     'key2': ['value2', 'value3'] 
    }, 
    { 
     'key1': 'value4', 
     'key2': ['value5'] 
    } 
] 

count = len(dicts) 
for a in range(count): 
    for b in range(len(dicts[a]["key2"])): 
     print "values: ", dicts[a]["key2"][b] 

for a, b in product(range(count), range(len(dicts[a]["key2"]))): 
    print("values: ", dicts[a]["key2"][b]) 
+0

なぜレンジレンループを使用していますか? – user2357112

+0

これで何を達成しようとしていますか? –

+0

私は物事を理解しやすくしていました。実際のコードはインデックスを使用しています。 – MvdD

答えて

3

をあなたそれはそれだけの価値はありませんが、一つのループにこれを折りたたむことができますが:

from itertools import chain 
from operator import itemgetter 

for val in chain.from_iterable(map(itemgetter('key2'), dicts)): 
    print("value:", val) 

それはちょうどネストされたループを維持し、厄介な範囲-LENをドロップするように、より読みやすいです:

for d in dicts: 
    for val in d['key2']: 
     print("value:", val) 
+0

同意すると、入れ子にされたループがなければ、より読みやすくなります。 – MvdD

1

あなたの目標が何であるかによって異なります。あなたは何ができる:

dicts = [ 
    { 
     'key1': 'value1', 
     'key2': ['value2', 'value3'] 
    }, 
    { 
     'key1': 'value4', 
     'key2': ['value5'] 
    } 
] 

all_vals = [] 
for d in dicts: 
    all_vals += d['key2'] 
print(", ".join(all_vals)) 
関連する問題