2016-11-20 5 views
0

タプルを受け入れるために範囲関数をハッキングする方法はありますか?このようなタプルのあるPythonの範囲は、入力としてリスト

範囲((0,0,0)、(10,1,5)、(1,1,1))

私は、カスタム・ポイント・クラス上の範囲を使用したいですリスト、タプルまたはクラスオブジェクトを返すことができます。私はforループ、whileループ、generator、list comprehensions、maps、filteringに疲れました。彼らは小さい数字の上で非常に良いです< 10しかし、彼らはあまりにも長い時間がかかります。これができる方法はありますか?

私はスペースを記述するために計画しています。例えば、あなたはいくつかの3dボックスのポイントを持っていますが、それは大きなポイントを持っていれば他の3dボックスをチェックする必要があります。この例ではこの範囲を2回呼び出す必要があります。 1つ:大きい方のボックスで使用可能な点については、大きなボックスで空の場合は小さい方の3次元のボックスですべての点をチェックする2番目の点。だから私は2分かかる範囲関数を持っている場合、これは4分+任意の関数を実行するためのexec時間が必要になります。今、このプロジェクトは、1つの小さな箱だけではなく、いくつかの大規模なものでなければなりません。ここで

+0

正確に何を返す関数が必要ですか? –

答えて

0

はそれがzippingunpackingitertools.productに基づいており、少しカスタムレンジ機能である:

>>> from itertools import product 
>>> from pprint import pprint 

>>> def my_range(start, stop, step): 
...  return product(*(xrange(*x) for x in zip(start, stop, step))) 

>>> r = ((0, 0, 0), (5, 2, 4), (1, 1, 1)) 

>>> pprint(list(my_range(*r))) 
[(0, 0, 0), 
(0, 0, 1), 
(0, 0, 2), 
(0, 0, 3), 
(0, 1, 0), 
(0, 1, 1), 
# ... 
(4, 1, 1), 
(4, 1, 2), 
(4, 1, 3)] 

パフォーマンスが重要になってきたときにしかし、あなたはの線に沿って独自のレンジクラスの実装をご覧くださいPython3 rangeオブジェクトがあります。これらの点は非常に高速になり、1つのボックスが別のボックスに含まれているかどうかをチェックして、すべての点を繰り返し処理する方法もあります。

+0

私はpprintが必要ですか?私はこれまでに見たことがありますが、ほとんどがシンプルなプリントとして使用されています。 – Danilo

+0

不要で、読みやすくするために使用しました( "pretty-print")。 – schwobaseggl

+0

myownの範囲クラスのために、私はそれを実装する将来のために良いと思われる、どのように反復の組み合わせの数を取得するか考えていますか? – Danilo

関連する問題