Ich habe folgenden Code:
new_index = index + offset
if new_index < 0:
new_index = 0
if new_index >= len(mylist):
new_index = len(mylist) - 1
return mylist[new_index]
Grundsätzlich berechne ich einen neuen Index und verwende diesen, um ein Element aus einer Liste zu finden. Um sicherzustellen, dass der Index innerhalb der Grenzen der Liste liegt, musste ich diese 2 if
Anweisungen in 4 Zeilen schreiben . Das ist ziemlich ausführlich, ein bisschen hässlich ... Ich wage zu sagen, es ist ziemlich unpythonisch .
Gibt es eine andere einfachere und kompaktere Lösung? (und mehr pythonisch )
Ja, ich weiß, dass ich if else
in einer Zeile verwenden kann, aber es ist nicht lesbar:
new_index = 0 if new_index < 0 else len(mylist) - 1 if new_index >= len(mylist) else new_index
Ich weiß auch, dass ich verketten max()
und min()
zusammen kann. Es ist kompakter, aber ich finde es etwas dunkel und schwieriger, Fehler zu finden, wenn ich es falsch schreibe. Mit anderen Worten, ich finde es nicht sehr einfach.
new_index = max(0, min(new_index, len(mylist)-1))
clamp = lambda value, minv, maxv: max(min(value, maxv), minv)
Verwenden der API von arma.sourceforge.net/docs.html#clampAntworten:
Das ist eigentlich ziemlich klar. Viele Leute lernen es schnell. Sie können einen Kommentar verwenden, um ihnen zu helfen.
quelle
def clamp(n, smallest, largest): return max(smallest, min(n, largest))
helperFunctions.py
? Ein separates Modul? Was ist, wenn dies mit verschiedenen "Hilfsfunktionen" für ganz andere Dinge übersät ist?utils.py
beispielsweise:
quelle
sorted()
eingebauten. Sehr kompakt, aber nur ein bisschen dunkel. Wie auch immer, es ist immer schön, andere kreative Lösungen zu sehen!min(max())
Bau. Sehr etwas schneller, wenn die Anzahl im Bereich liegt und keine Swaps erforderlich sind.viele interessante Antworten hier, alle ungefähr gleich, außer ... welche ist schneller?
paxdiablo hat es!, benutze einfach ol 'python. Die numpy Version ist, vielleicht nicht überraschend, die langsamste von allen. Wahrscheinlich, weil nach Arrays gesucht wird, bei denen die anderen Versionen nur ihre Argumente anordnen.
quelle
mm_clip
undpy_clip
gleich schnell sein, wenn Sie JIT - Compiler verwenden, wie PyPy. Nur dass Ersteres besser lesbar ist und Lesbarkeit in Pythons Philosophie wichtiger ist als ein geringfügiger Leistungsgewinn die meiste Zeit.Siehe numpy.clip :
quelle
clip
ista
, wird ein „Array - Elemente enthält , Clip“. Sie müssten alsonumpy.clip([index], …
nicht schreibennumpy.clip(index, …
.Verketten
max()
undmin()
zusammen ist die normale Redewendung, die ich gesehen habe. Wenn Sie Schwierigkeiten beim Lesen haben, schreiben Sie eine Hilfsfunktion, um die Operation zu kapseln:quelle
Was ist mit meiner geliebten lesbaren Python-Sprache passiert? :-)
Im Ernst, machen Sie es einfach zu einer Funktion:
dann nenne es einfach mit so etwas wie:
Oder eine einfachere, flexiblere Lösung, bei der Sie die Berechnung selbst durchführen:
Wenn Sie möchten, können Sie das Min / Max sogar zu einer Liste machen, damit es "mathematisch reiner" aussieht:
quelle
min
undmax
es ist viel klarer als eine Reihe von Bedingungen. (Ich weiß nicht, wofüradd
- sagen Sie einfachclamp(val + 7, 0, 42)
.)Dieser scheint mir pythonischer:
Einige Tests:
quelle
Wenn Ihr Code zu unhandlich erscheint, kann eine Funktion helfen:
quelle
Vermeiden Sie es, Funktionen für so kleine Aufgaben zu schreiben, es sei denn, Sie wenden sie häufig an, da dies Ihren Code überladen wird.
für einzelne Werte:
für Wertelisten:
quelle