How to avoid inconsistent s[i:-j] slicing behaviour when j is sometimes 0?

只愿长相守 提交于 2019-12-09 16:45:41

问题


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.



来源:https://stackoverflow.com/questions/42753582/how-to-avoid-inconsistent-si-j-slicing-behaviour-when-j-is-sometimes-0

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!