about 3 years ago

Avoid Using start, end, and stride in a Single Slice

延續條款 5,講得是 extended slicing。

>>> L = range(10)
>>> L[::2]
[0, 2, 4, 6, 8]
>>> L[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

如果 start,end 和 stride 三個放一起,造成難以閱讀的程式碼,尤其是 stride 為負數時。

a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
a[-2:2:-2]  # ['g', 'e']

a[2:-2:2]   # ['c', 'e']

比較好的方式是分成兩步

b = a[::2]   # ['a', 'c', 'e', 'g']

c = b[1:-1]  # ['c', 'e']

多產生一個 list 有點浪費,可以考慮 itertools.islice(),須注意的是它不接受負的參數

import itertools

list(itertools.islice('ABCDEFG', 2))  # ['A', 'B']

list(itertools.islice('ABCDEFG', 2, 4))  # ['C', 'D']

list(itertools.islice('ABCDEFG', 2, None))  # ['C', 'D', 'E', 'F', 'G']

list(itertools.islice('ABCDEFG', 0, None, 2))  # ['A', 'C', 'E', 'G']

https://docs.python.org/release/2.3.5/whatsnew/section-slices.html

← Effective Python 心得筆記: Item 5 Effective Python 心得筆記: Item 7 →
 
comments powered by Disqus