JSONオブジェクトのすべての葉に対してイテレータが必要です。だから私はこの関数を書いた新しいイテレータ内でイテレータの要素を生成する方法は?
rec = {'a': {'b': [{'c': {'d': [{'e': 'x1','f': 'x2'}],'g': 'x3'}}],'h': 'x4','i': 'x5','j': [{'k': 'x6'}],'l': [{'m': {'n': 'x7'}}]}}
def yield_leaves(rec, lbl = ''):
if isinstance(rec, dict):
for key, value in rec.items():
for to_yield in yield_leaves(value, key):
yield to_yield
if isinstance(rec, list):
for value in rec:
for to_yield in yield_leaves(value, lbl):
yield to_yield
if isinstance(rec, (int, str)):
for entry in rec.split():
yield entry, lbl
print(list(yield_leaves(rec)))
>>> [('x5', 'i'), ('x4', 'h'), ('x1', 'e'), ('x2', 'f'), ('x3', 'g'), ('x6', 'k'), ('x7', 'n')]
しかし、私はいくつかのコードは冗長だと思う。次の行
for to_yield in yield_leaves(value, key):
yield to_yield
それはイテレータを反復処理して、イテレータの一部として値を返します。
これをコードするより効率的な方法がわかりますか?
Python 3のyield_leaves(value、key)からの降順 –