class MultiIndexingList: def __init__(self, value): self.value= value def __repr__(self): return repr(self.value) def __getitem__(self, item): if isinstance(item, (int, slice)): return self.__class__(self.value[item]) return [self.value[i] for i in item] def __setitem__(self, item, value): if isinstance(item, int): self.value[item] = value elif isinstance(item, slice): raise ValueError('Cannot interpret slice with multiindexing') else: for i in item: if isinstance(i, slice): raise ValueError('Cannot interpret slice with multiindexing') self.value[i] = value def __delitem__(self, item): if isinstance(item, int): del self.value[item] elif isinstance(item, slice): del self.value[item] else: if any(isinstance(elem, slice) for elem in item): raise ValueError('Cannot interpret slice with multiindexing') item = sorted(item, reverse=True) for elem in item: del self.value[elem]
这允许切片和索引元素访问:
a = MultiIndexingList([1,2,3,4,5,6,7,8]) a # 输出:[1、2、3、4、5、6、7、8] a[1,5,2,6,1] # 输出:[2、6、3、7、2] a[4, 1, 5:, 2, ::2] # 输出:[5、2,[6、7、8],3,[1、3、5、7] # 4|1-|----50:---|2-|-----::2----- <-- indicated which element came from which index
设置和删除元素时仅允许使用逗号分隔的整数索引(无切片):
a[4] = 1000 a # 输出:[1、2、3、4、1000、6、7、8] a[2,6,1] = 100 a # 输出:[1、100、100、4、1000、6、100、8] del a[5] a # 输出:[1、100、100、4、1000、100、8] del a[4,2,5] a # 输出:[1、100、4、8]