2016-04-21 4 views
1

handeln Ich habe mein Problem zu etwas sehr einfach abstrahiert. Ich würde gerne die [:-0] mir geben [:] aber kann nicht sehen, wie es geht, ohne einen speziellen Fall zu verwenden.sequentiell kürzere Liste von rechts über Indexierung - müssen [: -0] wie [:]

Ich versuche, das Verhalten zu bekommen unten angegeben:

Die ersten Fälle nur der Vollständigkeit halber sind.

a = range(6) 

print "a[i:] for i in range(3)" 
for i in range(3): 
    print a[i:] 

print "a[:i] for i in range(3)" 
for i in range(3): 
    print a[:i] 

print "a[-i:] for i in range(3)" 
for i in range(3): 
    print a[-i:] 

print "a[:i] for i in [None, -1, -2] DESIRED RESULT" 
for i in [None, -1, -2]: 
    print a[:i] 

print "a[:-i] for i in range(3) BUT CAN'T GET IT HERE" 
for i in range(3): 
    print a[:-i] 

print "a[:i] for i in [0, -1, -2] OR HERE EITHER" 
for i in [0, -1, -2]: 
    print a[:i] 

Sie können es in 2.7 laufen oder unten auf die Ergebnisse beziehen sich nur:

a[i:] for i in range(3) 
[0, 1, 2, 3, 4, 5] 
[1, 2, 3, 4, 5] 
[2, 3, 4, 5] 

a[:i] for i in range(3) 
[] 
[0] 
[0, 1] 

a[-i:] for i in range(3) 
[0, 1, 2, 3, 4, 5] 
[5] 
[4, 5] 

a[:i] for i in [None, -1, -2] DESIRED RESULT 
[0, 1, 2, 3, 4, 5] 
[0, 1, 2, 3, 4] 
[0, 1, 2, 3] 

a[:-i] for i in range(3) BUT CAN'T GET IT HERE 
[] 
[0, 1, 2, 3, 4] 
[0, 1, 2, 3] 

a[:i] for i in [0, -1, -2] OR HERE EITHER 
[] 
[0, 1, 2, 3, 4] 
[0, 1, 2, 3] 

Antwort

3

Sie müssen die Vorteile von Python Koaleszierstruktur Betreiber nehmen:

>>> for i in range(3): 
...  print a[:-i or None] 
... 
[0, 1, 2, 3, 4, 5] 
[0, 1, 2, 3, 4] 
[0, 1, 2, 3] 
>>> for i in [0, -1, -2]: 
...  print a[:i or None] 
... 
[0, 1, 2, 3, 4, 5] 
[0, 1, 2, 3, 4] 
[0, 1, 2, 3] 
+0

WOW! Das ist großartig! Ist das relativ neu? (Blick auf [PEP-505] (https://www.python.org/dev/peps/pep-0505/#abstract)) – uhoh

+1

Nr. 'und' und' oder' haben zusammenwachsendes Verhalten seit ... 1.5 , mindestens. Alle in PEP 505 beschriebenen Operatoren beziehen sich spezifisch auf "None" und nicht auf die Wahrheit der Operanden. –

+0

@ IgnacioVazquez-Abrams können Sie bitte erklären, was hier passiert? Wenn man die zusammenwachsenden Operatoren liest, schlägt dies vor, dass die bool-Prüfungen fortgesetzt werden, bis etwas gefunden wird, das wahr ist - ein "Standardwert". Aber 'bool (None) = False ', also ist es hier tatsächlich so, dass es _omes_ aus den Optionen zurückgeben muss, also die letzte Option unabhängig von der Wahrheit zurückgibt, wenn alle vorhergehenden Optionen False sind? – roganjosh