问题
I am creating a number of slices [-WINDOW-i:-i]
of a list, where i
ranges between 32
and 0
:
vals = []
for i in range(32, -1, -1):
vals.append(other_list[-WINDOW-i:-i])
When i == 0
, this returns a slice of length 0:
other_list[-WINDOW-0:0]
I don't want to have to do this to solve it:
vals = []
for i in range(32, -1, -1):
if i == 0:
vals.append(other_list[-WINDOW:])
else:
vals.append(other_list[-WINDOW-i:-i])
… because if I have many lists to append to vals
, it gets messy.
Is there a clean way to do this?
回答1:
One workaround for this quirk in Python slicing is to take advantage of these facts:
false_ish_value or other_value
always evaluates toother_value
0
is the only integer that is false-ish in a boolean contexts[n:None]
is equivalent tos[n:]
With those in mind, you can write your slice as:
other_list[-WINDOW-i:(-i or None)]
… and the slice will be interpreted as [-WINDOW-i:None]
(which is the same as [-WINDOW-i:]
) only when i
(and therefore -i
) is 0
.
来源:https://stackoverflow.com/questions/42753582/how-to-avoid-inconsistent-si-j-slicing-behaviour-when-j-is-sometimes-0