2016-11-20 2 views
0

Gibt es eine Möglichkeit, Bereich-Funktion zu hacken, Tupel zu akzeptieren?Python-Bereich mit Tupel, Liste als Imput

wie folgt aus:

Bereich ((0,0,0), (10,1,5), (1,1,1))

Ich möchte auf benutzerdefinierten Punktklasse Bereich verwenden Es kann eine Liste, ein Tupel oder ein Klassenobjekt zurückgeben. Ich ermüdete die for-Schleifen, während Schleifen, Generatoren, Listen-Comprehensions, Karten und Filter. Sie sind sehr gut auf kleinere Zahlen < 10, aber auf größere Zahlen nehmen sie zu lange. Gibt es eine Möglichkeit, dies zu tun?

Und ich plane, diese Funktion zu verwenden, um Raum zu beschreiben, zum Beispiel haben Sie verfügbare Punkte von einigen 3D-Box, müssen Sie einige andere 3D-Box überprüfen, wenn es in einem Punkt mit der größeren 3D-Box gefunden werden kann, so dass ich müsste diesen Bereich in diesem Beispiel 2 Mal aufrufen. One: für die verfügbaren Punkte in größeren 3D-Box, und zweitens, um jeden Punkt in kleineren 3D-Box zu überprüfen, wenn es in größeren Box leer ist. Also, wenn ich Reichweitenfunktionen habe, die 2 Minuten dauern, benötigt dieser 4 Minuten + Exec-Zeit für irgendeine Funktion, die getan werden muss. Jetzt muss dieses Projekt in größerem Maßstab sein, nicht nur 1 kleine Box, sondern mehrere.

+0

Sie wollen eine Funktion, die zurückgibt ... was genau? –

Antwort

0

ist hier ein wenig benutzerdefinierte Range-Funktion, die auf zipping, unpacking und itertools.product basiert:

>>> 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)] 

Wenn jedoch die Leistung wichtiger wird, Sie bei der Umsetzung Ihrer eigenen Bereich Klasse entlang der Linien von der aussehen sollte Python3 range Objekt, da diese Punkte ziemlich schnell zahlreich werden und es viel klügere Wege gibt zu überprüfen, ob eine Box in einer anderen enthalten ist und dann über alle Punkte iteriert.

+0

brauche ich pprint? Ich habe es vorher gesehen, aber meistens wird es als einfacher Druck verwendet – Danilo

+0

Keine Notwendigkeit, nur verwendet, um es lesbar zu machen ("Pretty-Print"). – schwobaseggl

+0

entschieden für myown range class, scheint besser für die Zukunft, dass ich es implementieren, haben Sie eine Idee, wie man die Anzahl der Kombinationen für die Iteration bekommen? – Danilo

Verwandte Themen