2016-04-19 8 views
1

python(itertoolsなどを使用して)でネストされた反復可能な要素fを対応するリストまたはタプルに簡単に変換できますか?私はfを保存して、それを複数回反復することができます。つまり、fのいくつかのネストされた要素がジェネレータである場合、問題が発生します。ネストされたiterableをリストに変換する

入出力の例を示します。

>>> g = iter(range(2)) 
>>> my_input = [1, [2, 3], ((4), 5), [6, g]] 
>>> magical_function(my_input) 
[1, [2, 3], [[4], 5], [6, [0, 1]]] 

出力がタプルで構成されていても問題ありません。問題は、gを反復することでそれを「消費」するため、再度使用することはできません。

+1

ネストされた反復可能プログラムの「対応するリスト」とはどういう意味ですか? iterableを平坦化しますか?もしそうなら、1レベルの平坦化、nレベルの平坦化、または再帰的な平坦化が必要ですか? – user2357112

+0

私は平坦化を望んでいません。 "対応リスト"によって、私は '' f''のネストされた構造を保持したいと考えています。 –

+1

いくつかのコードサンプルを提供してもよろしいですか? – Nilesh

答えて

2

これは、各要素がiterableであるかどうかをチェックし、iterableの場合は再帰関数を呼び出すことが最善のようです。それはきれいな方法ではない、とあなたはそれを改善する方法を見つけることができます(それはAですべてを置く

$ python3 so.py 
[1, [2, 3], [4, 5], [6, [0, 1]]] 
[1, [2, 3], [4, 5], [6, [0, 1]]] 

を返し

import collections 

g = iter(range(2)) 
my_input = [1, [2, 3], ((4), 5), [6, g]] 

def unfold(iterable): 
    ret = [] 
    for element in iterable: 
     if isinstance(element, collections.Iterable): 
      ret.append(unfold(element)) 
     else: 
      ret.append(element) 
    return ret 

n = unfold(my_input) 
print(n) 
print(n) 

:だけで簡単にドローアップとして、私のような何かをしようとするだろうリストをタプルを保存する代わりに)、ここでは私が使用する一般的な考え方です。

+0

これはまさに私が望むものです!私はitertoolsにすでに実装されているようなものがあるかどうか疑問に思っていました(私が好きだったのはずっと後にこれらのことを見つけましたが)。 –

関連する問題