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#clamp