內置函數slice
有什麼用,我該如何使用它?
Pythonic切片的直接方式我知道 - l1[start:stop:step]
。我想知道如果我有切片對象,那我該如何使用它?Python切片技巧,我知道Python切片,但我怎樣才能使用內置的切片對象呢?
回答
通過調用片具有相同的字段創建片,如果這樣做,你會使用[開始:結束:步]符號:
sl = slice(0,4)
要使用切片,只是把它當作好像它是指數成列表或字符串:
>>> s = "ABCDEFGHIJKL"
>>> sl = slice(0,4)
>>> print(s[sl])
'ABCD'
假設您有一個固定長度文本字段的文件。您可以定義切片列表,以便輕鬆從該文件中的每個「記錄」中提取值。
data = """\
0010GEORGE JETSON 12345 SPACESHIP ST HOUSTON TX
0020WILE E COYOTE 312 ACME BLVD TUCSON AZ
0030FRED FLINTSTONE 246 GRANITE LANE BEDROCK CA
0040JONNY QUEST 31416 SCIENCE AVE PALO ALTO CA""".splitlines()
fieldslices = [slice(*fielddef) for fielddef in [
(0,4), (4, 21), (21,42), (42,56), (56,58),
]]
fields = "id name address city state".split()
for rec in data:
for field,sl in zip(fields, fieldslices):
print("{} : {}".format(field, rec[sl]))
print('')
打印:
id : 0010
name : GEORGE JETSON
address : 12345 SPACESHIP ST
city : HOUSTON
state : TX
id : 0020
name : WILE E COYOTE
address : 312 ACME BLVD
city : TUCSON
state : AZ
id : 0030
name : FRED FLINTSTONE
address : 246 GRANITE LANE
city : BEDROCK
state : CA
id : 0040
name : JONNY QUEST
address : 31416 SCIENCE AVE
city : PALO ALTO
state : CA
slice
函數返回slice objects。 Slice對象是Python的內部類型之一,它爲讀取性能進行了優化 - 它們的所有屬性都是隻讀的。
如果希望更改默認行爲,則更改slice
可能會很有用。例如,lxml
使用切片符號來訪問DOM元素(但是,我還沒有確認他們是如何做到這一點的)。
下一個序列方括號表示無論是索引或切片取決於括號裏面是什麼:
>>> "Python rocks"[1] # index
'y'
>>> "Python rocks"[1:10:2] # slice
'yhnrc'
這些情況都被__getitem__()
方法處理(或__setitem__()
,如果在等號左邊)。索引或切片作爲單個參數傳遞給方法,並且t他這樣做的方式是通過將切片符號(在本例中爲1:10:2
)轉換爲切片對象:slice(1,10,2)
。
所以,如果你要定義自己的序列狀類或覆蓋另一個類的__getitem__
或__setitem__
或__delitem__
方法,你需要測試的指標參數來確定它是否是相應的int
或slice
和過程:
def __getitem__(self, index):
if isinstance(index, int):
... # process index as an integer
elif isinstance(index, slice):
start, stop, step = index.indices(len(self)) # index is a slice
... # process slice
else:
raise TypeError("index must be int or slice")
甲slice
對象有三個屬性:start
,stop
和step
,和一個方法:indices
,這需要一個參數,該對象的長度,並返回一個3元組:(start, stop, step)
。
>>> class sl:
... def __getitem__(self, *keys): print keys
...
>>> s = sl()
>>> s[1:3:5]
(slice(1, 3, 5),)
>>> s[1:2:3, 1, 4:5]
((slice(1, 2, 3), 1, slice(4, 5, None)),)
>>>
請參閱Don的回覆以獲取解釋。 – abc 2013-02-02 01:51:45
這也是有益的,也指出可以有多個切片傳遞給'__getitem__':s [1:2:3,1:4:5] =>(切片(1,2,3),1 ,切片(4,5,無))'。 – OozeMeister 2017-11-04 21:55:56
- 1. 切片python os.listdir()
- 2. 用Python切片url
- 3. 使用切片功能切片JSON對象
- 4. 切片扔使用Python中
- 5. Python切片操作
- 6. Matlab vs Python:切片
- 7. Python列表切片
- 8. 切片python列表
- 9. Python的迭代切片對象
- 10. Python切片分配內存使用
- 11. 使用協調的切片/切片UiImage
- 12. 爲什麼切片對象在Python
- 13. 切片使用指針切片
- 14. 切片鑑別器 - 按位置切片
- 15. 重新切片切片Golang
- 16. 追加切片切片
- 17. 字符切片的Python
- 18. Python切片中的模量
- 19. 關於Python中的切片
- 20. python中的擴展切片?
- 21. Python的元組切片
- 22. Python的切片列表
- 23. 的Python:層次切片
- 24. 對象切片有用嗎?
- 25. 如何切片在Python中切片的列表?
- 26. 自定義Python切片,請告知
- 27. 切片??附加列表Python
- 28. 在python中切片csv
- 29. Python列表切片錯誤
- 30. 在python中比較切片
這對我有用。 def __slice __(self,start = None,end = None,step = None):return self.obj [slice(start,end,step)] – user2290820 2014-12-14 15:18:13