当j有时为0时,如何避免不一致的s [i:-j]切片行为?

she*_*ell 8 python slice python-3.x

我正在创建一个[-WINDOW-i:-i]列表的多个切片,其中的i范围在32和之间0:

vals = []

for i in range(32, -1, -1):
    vals.append(other_list[-WINDOW-i:-i])
Run Code Online (Sandbox Code Playgroud)

何时i == 0,返回长度为0的切片:

other_list[-WINDOW-0:0]
Run Code Online (Sandbox Code Playgroud)

我不想这样做来解决它:

vals = []

for i in range(32, -1, -1):
    if i == 0:
       vals.append(other_list[-WINDOW:])
    else:
       vals.append(other_list[-WINDOW-i:-i])
Run Code Online (Sandbox Code Playgroud)

...因为如果我要附加许多列表vals,它会变得混乱.

有干净的方法吗?

Zer*_*eus 10

Python切片中这个怪癖的一个解决方法是利用这些事实:

  1. false_ish_value or other_value 总是评估为 other_value
  2. 0是布尔上下文中唯一的false-ish整数
  3. s[n:None] 相当于 s[n:]

考虑到这些,您可以将切片写为:

other_list[-WINDOW-i:(-i or None)]
Run Code Online (Sandbox Code Playgroud)

...并且只有在(因此)时,切片才会被解释为[-WINDOW-i:None](它是相同的).[-WINDOW-i:]i-i0