二维列表如何获取子区域元素的组成
用过 numpy 的应该都知道,在二维数组中可以方便地使用区域切片功能,如下图:
而这个功能在 Python 标准库的 list 中是不支持的,在 list 中只能以一维方式来进行切片操作:
__getitem__方法
有时候我只想用一下这个功能,但又不想引入 numpy。其实这时候我也是可以在 Python 中实现的。这时候,只需在一个类中实现__getitem__
特殊方法:
class Array:
"""实现__getitem__,支持序列获取元素、Slice等特性"""
def __init__(self, lst):
self.__coll = lst
def __repr__(self):
"""显示列表"""
return '{!r}'.format(self.__coll)
def __getitem__(self, key):
"""获取元素"""
slice1, slice2 = key
row1 = slice1.start
row2 = slice1.stop
col1 = slice2.start
col2 = slice2.stop
return [self.__coll[r][col1:col2] for r in range(row1, row2)]
a = Array([['a', 'b', 'c', 'd'],
['e', 'f', 'g', 'h'],
['i', 'j', 'k', 'l'],
['m', 'n', 'o', 'p'],
['q', 'r', 's', 't'],
['u', 'v', 'w', 'x']])
print(a[1:5, 1:3])
lambda方法
a = [['a', 'b', 'c', 'd'],
['e', 'f', 'g', 'h'],
['i', 'j', 'k', 'l'],
['m', 'n', 'o', 'p'],
['q', 'r', 's', 't'],
['u', 'v', 'w', 'x']]
sl = lambda row1, row2, col1, col2, lst: \
[lst[r][col1:col2] for r in range(row1, row2)]
sl(1, 5, 1, 3, a)