2016-12-10 4 views
1

Ich möchte ein Tupel (genannt Zeiger) zu einem anderen Tupel hinzufügen, wenden Sie dann eine Klammerfunktion an, die ich für jedes seiner Elemente erstellt habe, und gebe schließlich das neue Tupel zurück. Ich bin sicher, dass es ein besserer Weg, dies zu tun ist:Hinzufügen von zwei Tupel und Anwenden einer Funktion auf jedes Element

from operator import add 

pointer = (1, 1) 
tuple2 = (1, 5) 

pointer = map(add, pointer, tuple2) 
x, y = pointer 
x, y = clamp(x, 0, 3), clamp(y, 0, 3) # min = 0, max = 3 
pointer = (x, y) 

[OUTPUT] Zeiger: (2, 3)

+0

was fügt do in map hinzu? –

+0

bieten vollständigen Code und fragen Sie hier: codereview.stackexchange.com – MYGz

+0

Ich aktualisierte den Code, um den Import aufzunehmen, fügt es die Elemente der Tupel zusammen. –

Antwort

2

Eine Möglichkeit wäre functools.partial zu verwenden, um eine Klemmfunktion mit gemischten Grenzen zu schaffen, und dann Karte, die über die Karte, Objekt, das Sie nach dem Hinzufügen Operation erhalten.

from operator import add 
from functools import partial 

def clamp(x, lo, hi): 
    return max(lo, min(x, hi)) 

pointer = (1, 1) 
tuple2 = (1, 5) 
pointer = tuple(map(partial(clamp, lo=0, hi=3), map(add, pointer, tuple2))) 
print(pointer) 

Ausgang

(2, 3) 

Eine andere Möglichkeit wäre die Zugabe und Klemm in eine einzige Funktion zu kombinieren. Im folgenden Code verwende ich eine Funktion make_add_clamp, die eine Funktion zurückgibt, die das Hinzufügen und das Klemmen unter Verwendung der Grenzen durchführt, die an make_add_clamp übergeben werden.

from operator import add 

def clamp(x, lo, hi): 
    return max(lo, min(x, hi)) 

def make_add_clamp(lo, hi): 
    def func(x, y): 
     return clamp(x + y, lo, hi) 
    return func 

pointer = (1, 1) 
tuple2 = (1, 5) 

pointer = tuple(map(make_add_clamp(0, 3), pointer, tuple2)) 
print(pointer) 
0

Sie verwenden itertools.chain können, die itertools.chain() -Methode kann verwendet werden, um diese Aufgabe zu vereinfachen. Es nimmt eine Liste von Iterablen als Eingabe und gibt einen Iterator zurück, der die Tatsache, dass Sie wirklich auf mehrere Container einwirken, effektiv maskiert. Zur Veranschaulichung betrachten Sie dieses Beispiel:

>>>from itertools import chain 
>>>a = [1, 2, 3, 4] 
>>>b = ['x', 'y', 'z'] 
>>>for x in chain(a, b): 
... 
print(x) 
... 
1 
2 
3 
4 
x 
y 
z 
+0

In ihrem aktuellen Status beantwortet Ihre Antwort nicht die Frage des OP. Sie sollten zeigen, wie "Kette" auf das Problem des OP angewendet werden kann. –

1

können Sie teilweise anwenden clamp manuell:

>>> def clamp(a, m, M): 
... return min(max(a, m),M) 
... 
>>> clamp(2, 0, 3) 
2 
>>> clamp(6, 0, 3) 
3 

So eine neue Funktion definieren ...

>>> def clamp_partial(n): 
... return clamp(n,0,3) 
... 

Und schließlich

>>> tuple(map(clamp_partial, map(add, pointer, tuple2))) 
(2, 3) 
>>> 

Einige Die Leute finden jedoch verständliche Ausdrücke/Generatorausdrücke lesbarer. Und es ist nicht notwendig, eine neue Funktion zu definieren.

>>> pointer = (1, 1) 
>>> tuple2 = (1, 5) 
>>> pointer = (t1 + t2 for t1, t2 in zip(pointer, tuple2)) 
>>> pointer 
<generator object <genexpr> at 0x10218a780> 
>>> pointer = tuple(clamp(p, 0, 3) for p in pointer) 
>>> pointer 
(2, 3) 
>>> 
Verwandte Themen