Frage

Bär mit mir, während ich erklären, meine Frage. Weiter unten auf die fettgedruckte Überschrift, wenn Sie bereits erweiterte Slice Liste Indizierung verstehen.

In Python können Sie Indexlisten mit Slice-Notation. Hier ein Beispiel:

>>> A = list(range(10))
>>> A[0:5]
[0, 1, 2, 3, 4]

Sie können auch einen Schritt umfassen, die wie ein „Schritt“ wirkt:

>>> A[0:5:2]
[0, 2, 4]

Der Schritt wird auch als negativ erlaubt, die Elemente Bedeutung in umgekehrter Reihenfolge abgerufen werden:

>>> A[5:0:-1]
[5, 4, 3, 2, 1]

Aber warten Sie! Ich wollte [4, 3, 2, 1, 0] sehen. Oh, ich sehe, ich brauche das Start- und End-Indizes zu verringern:

>>> A[4:-1:-1]
[]

Was ist passiert? Es ist die Interpretation -1 als am Ende des Feldes zu sein, nicht am Anfang. Ich weiß, Sie können dies erreichen, wie folgt:

>>> A[4::-1]
[4, 3, 2, 1, 0]

Aber man kann dies nicht in allen Fällen verwendet werden. Zum Beispiel in einem Verfahren, das vergangen Indizes gewesen ist.

Meine Frage lautet:

Gibt es eine gute pythonic Weise verlängert Scheiben mit mit negativen Schritten und expliziter Start- und Zielindizes , die ist das erste Element einer Sequenz?

Das ist, was ich mit so weit habe kommen, aber es scheint nicht zufriedenstellend.

>>> A[0:5][::-1]
[4, 3, 2, 1, 0]
War es hilfreich?

Lösung 2

Ok, ich denke, das ist wahrscheinlich so gut wie ich es bekommen. Dank Abgan die Idee auslöste. Dies beruht auf der Tatsache, dass keiner in einer Scheibe behandelt wird, als ob es dich um einen fehlenden Parameter waren. Jeder bekam etwas besser?

def getReversedList(aList, end, start, step):
    return aList[end:start if start!=-1 else None:step]

edit: Check für start==-1, nicht 0

Dies ist immer noch nicht ideal, weil man das übliche Verhalten von -1 ist clobbering. Es scheint, das Problem hier ist, zwei überlappende Definitionen dessen, was geschehen soll ist. Wer gewinnt wegnimmt sonst gültige Anrufungen für die andere Absicht suchen.

Andere Tipps

Es ist fehleranfällig, die Semantik von start und stop zu ändern. Verwenden Sie None oder -(len(a) + 1) statt 0 oder -1. Die Semantik ist nicht willkürlich. Siehe Edsger W. Dijkstra Artikel „Warum Nummerierung sollte bei Null anfangen“ .

>>> a = range(10)
>>> start, stop, step = 4, None, -1

oder

>>> start, stop, step = 4, -(len(a) + 1), -1
>>> a[start:stop:step]
[4, 3, 2, 1, 0]

oder

>>> s = slice(start, stop, step)
>>> a[s]
[4, 3, 2, 1, 0]

Wenn s ist eine Folge der negativen Indizes in s[i:j:k] sind behandelt speziell :

  

Wenn i oder j negativ ist, ist der Index bis zum Ende des Strings relativ:   len(s) + i oder len(s) + j substituiert ist. Aber beachten Sie, dass -0 noch 0.

das ist, warum len(range(10)[4:-1:-1]) == 0, weil es entspricht range(10)[4:9:-1].

[ A[b] for b in range(end,start,stride) ]

Langsamer, aber können Sie negative Indizes verwenden, so sollte dies funktionieren:

[ A[b] for b in range(9, -1, -1) ]

Ich weiß, dies nicht mit Scheiben, sondern dachte, dass ich auf jeden Fall die Lösung bieten würde, wenn Scheiben speziell für das Erhalten des Ergebnisses mit keiner Priorität.

Ich glaube, dass die folgenden Ihnen nicht erfüllen:

def getReversedList(aList, end, start, step):
    if step < 0 and start == 0:
         return aList[end::step]
    return aList[end:start:step]

oder nicht wahr? : -)

  

Aber verwenden Sie nicht, wenn Sie sind   Ihre Indizes in Variablen speichern für   Beispiel.

Ist das ausreichend?

>>> a = range(10)
>>> start = 0
>>> end = 4
>>> a[4:start-1 if start > 0 else None:-1]
[4, 3, 2, 1, 0]

Wie Sie sagen, nur sehr wenige Menschen voll alles verstehen, dass Sie mit erweiterten Slicing tun können, so dass, wenn Sie wirklich die zusätzliche Leistung muss ich es tun würde, die „offensichtlich“ Art und Weise:

rev_subset = reversed(data[start:stop])

a[4::-1]

Beispiel:

Python 2.6 (r26:66714, Dec  4 2008, 11:34:15) 
[GCC 4.0.1 (Apple Inc. build 5488)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[4:0:-1]
[4, 3, 2, 1]
>>> a[4::-1]
[4, 3, 2, 1, 0]
>>> 

Der Grund dafür ist, dass die zweite Amtszeit als interpretiert wird „während nicht-Index ==“. Verlassen Sie es aus ist „während Index im Bereich“.

Ich weiß, dass dies eine alte Frage, aber falls jemand wie ich sucht nach Antworten:

>>> A[5-1::-1]
[4, 3, 2, 1, 0]

>>> A[4:1:-1]
[4, 3, 2]

Sie können ein slice(start, stop, step)-Objekt verwenden, die so beschaffen ist, dass

s=slice(start, stop, step)
print a[s]

ist die gleiche wie

print a[start : stop : step]

und darüber hinaus können Sie eines der Argumente auf None nichts zwischen den Doppelpunkte anzuzeigen. So im Fall Sie geben, können Sie slice(4, None, -1) verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top