How to avoid inconsistent s[i:-j] slicing behaviou

2019-04-24 18:55发布

问题:

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:

  1. false_ish_value or other_value always evaluates to other_value
  2. 0 is the only integer that is false-ish in a boolean context
  3. s[n:None] is equivalent to s[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.