iterableを常に標準的な方法で反復処理するという条件で、iterableを受け取り、tupleを返す関数を作成しようとしています。たとえば、入力の繰り返しがlist
またはtuple
のような場合は、入力を受け入れますが、dict
のようなものではありません(キーの順番での保証はありません)。同じ順序で反復されるオブジェクトと、バージョン間のバージョンが変更される可能性があるオブジェクト、またはPYTHONHASHSEED
に依存するオブジェクトの間で、異なるオブジェクトを検出するPython関数はありますか?Pythonで順序付きiterables(シーケンス)を検出する
isinstance(x, collections.Sequence)
私が望むほとんどのものは行いますが、ジェネレータはシーケンスではありません。次のコードは私が望むことをしているようですが、何かを残しているのか、順序付けられたアイデアをキャプチャするより一般的な方法があるかどうかはわかりません。
import collections, types
def to_tuple(x):
if isinstance(x, collections.Sequence) or isinstance(x, types.GeneratorType):
return tuple(x)
raise Exception("Cannot be iterated canonically")
- あなたが行くことができません同様の方法で同じ発電機で2回目です。なぜそれを含めるのですか? –
@AdamSosnowskiそれが問題であれば、私は 'itertools.tee()'を使ってジェネレータを最初にクローン化することができますが、私の用途では、元の入力をマングリングしても問題ありません。 –