Python基础 - 索引器,切片语法
索引器
语法:obj[key]
a) 一般key为int和str比较常见,但是Python下的索引器的key也可以是float, tuple, list, dict等任意对象。
b) 索引器会由解释器帮我们转换成对__getitem__函数的调用。
class MyTest(): def __getitem__(self, key): print(type(key)) return 0 a = MyTest() a[1] # key类型: int a["a"] # key类型: str a["a", "b"] # key类型: tuple a[("a", "b")] # key类型: tuple a[[1, 2]] # key类型: list a[{"a":1, "b":2}] # key类型: dict
切片
语法:object[start:end:step]
a) 切片必须和索引器一起使用,没法单独使用。a = 0:3这样的写法是不行的
b) 切片会由解释器会帮我们把切片信息转换成slice对象,然后作为key调用索引器。
c) start默认为0,end默认为len-1且不包含,step默认为1。参数间使用:分隔,而不是常见的逗号。如果:后不写值,就相当于参数传None,使用默认值
用法
list1 = ["a", "b", "c", "d"] print(list1[:]) # ['a', 'b', 'c', 'd'], 所有数据 # list[None:None], list[::], list[None:None:None], list[None::], list[:None:]等写法都是和上面等价的 print(list1[0:1]) # ['a'] # list1[None:1:None], list[:1], list[None:1], list[:1:]等写法都是和上面等价的 print(list1[0::2]) # ['a', 'c'], 步进为2 # list[::2], list[None:None:2]等写法都是和上面等价的 print(list1[1:-1]) # ['b', 'c'], 第2个到倒数第2个间的数据 # list[1:-1:], list[1:-1:None]等写法都是和上面等价的
自定义的类上使用切片
class MySlice(): def __init__(self): self.data = ["a", "b", "c"] def __getitem__(self, key): print(type(key)) return self.data[key] all_data = MySlice() sub_data = all_data[0:2] print(type(sub_data)) # <class 'list'> print(sub_data) # ['a', 'b'] sub_data = all_data[0:4] # 越界也没事 print(sub_data) # ['a', 'b', 'c'] my_slice = slice(0, 2) #直接用slice也是一样的效果 print(my_slice.start, my_slice.stop, my_slice.step) # 0 2 None sub_data = all_data[my_slice] print(sub_data) # ['a', 'b']
自己处理slice对象
class MySlice(): def __init__(self): self.data = ["a", "b", "c"] def __getitem__(self, key): if type(key) is slice: start = key.start or 0 data_len = len(self.data) stop = key.stop or data_len stop = data_len if stop > data_len else stop step = key.step or 1 result = [self.data[i] for i in range(start, stop, step)] return result return self.data[key]
所以Pandas下面的写法就好理解了
df = pandas.read_excel("./data.xlsx") rows = df.loc[1:3, ["name", "count"]] # 第2至4行, 只需要name, count列 print(type(rows)) # <class 'pandas.core.frame.DataFrame'> print(rows)
df.loc的索引器调用,key是一个tuple对象, tuple(slice, list)
参考
Python 的切片为什么不会索引越界? (baidu.com)
全面深入彻底理解Python切片操作【原创】_混沌鳄鱼的博客-CSDN博客
python3 编程项目如何使用 slice 函数命名切片? - 知乎 (zhihu.com)