私はPythonで任意にネストされたdictsのデカルト積を行うアルゴリズムを実装しました。ルートレベルにあるフィールドは、複数の行に複製する必要がありました。配列がネストされる可能性もあります。私はitertools.product
を再帰的に使用し、中間イテレータを集約しました。動的に生成されたネストされたタプル
動作していますが、問題は最終段階でのアンパックです。 私はこのような構造になった:
(11, 12.2, 123.2, 1.23, 104.75, (10.7, 104.75, 104.75, ('N', True, False, 'B2B'), 99.01, 6.3, 1.23, 5.87, 12.2), 1, 'SP', 7)
。
私はリスト内包やジェネレータ式またはこの行を平らにし、きれいにすることができるにも本格的な発電機を探しています:
(11, 12.2, 123.2, 1.23, 104.75, 10.7, 104.75, 104.75, 'N', True, False, 'B2B', 99.01, 6.3, 1.23, 5.87, 12.2, 1, 'SP', 7)
。
これを実行する最善の方法は何ですか。私はitertools.product
の出力を遮断する、フックに含める必要があるので、私はを求めてきたもの
実際にEDIT
は、リスト内包やジェネレータ式、あるいは本格的な発電です自体。これらのタプルをクリーニングするには、単にの方法が必要なわけではありません。したがってはではありません。
皆さん、私はこのための再帰関数は欲しくありません! 私は、__iter__()
メソッドが動的に生成されたデータのitertools.product
を返すクラスを持っています。私はこれらのいずれかをしようとしている:変換を扱う別のオブジェクトに
class Explosion:
...
def __iter__(self):
return product(*self.fragments)
カプセル化が、これはあまり望ましい:
は内部タプルを処理するために、このメソッドを変更
class CleanOutput: def __init__(self, it): self.it = it def next(self): for x in self.it: yield ? class Explosion: ... def __iter__(self): return CleanOutput(product(*self.fragments))
あなたはどのようにあなたが最初に達成することをあなたのコードを表示することができます結果? – Kasramvd
申し訳ありません@Kasramvd、私はできません。しかし、それほど複雑ではありません。単純な_flatten dict_アルゴリズムです。シーケンスが手元にあるときを検出し、その要素を取得して試してみて、プリミティブであれば使用するitertools.productでは、ネストされたdictの場合、エントリごとにルートオブジェクトのような別の爆発オブジェクトを作成する必要があるため、難しくなります。次に、リストを連結してこれらの製品(ネストされたタプル)を結合し、これに外部製品を適用します。 – rsalmei
正直言って、私はあなたがリンクされたページから最高の投票回答を使用するのを止めているのか分かりません。 'product'は反復子を返します。これは関数に送られ、' return flatten(product(...) 'のような結果ジェネレータを返します。 – vaultah