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)

 

posted @ 2023-09-15 20:30  yanghui01  阅读(36)  评论(0编辑  收藏  举报