用过NumPY
的应该都知道,在二维数组中可以方便地使用区域切片功能,如下图:
而这个功能在Python标准库的List
中是不支持的,在List
中只能以一维方式来进行切片操作:
但有时候我只想用一下这个功能,但又不想引入NumPY
。其实这时候我也是可以在Python中实现的。这时候,只需在一个类中实现__getitem__
特殊方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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)]
|
试试看:
1
2
3
4
5
6
7
8
|
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 ])
|
官方文档对__getitem__
的解释:
简而言之,其主要用来获取self[key]
的值。
我在这里为了突出问题解决,只列出了关键代码,异常判断、边界检查、条件限制,甚至其他一些特殊方法如__setitem__
、 __delitem__
与__len__
等代码,需视实际情况添加。
当然,也有其他处理方式,如以下所示代码,但不同方法无疑给了我各种场景下的多种选项。
1
2
3
4
5
6
7
8
9
10
11
|
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)
|
总结
以上就是这篇文章的全部内容了,Python编程一个吸引我的地方就是,它就像是一座金矿,挖着挖着很可能就挖出些意想不到的乐趣出来。希望本文的内容对大家学习或者使用python能有一定的帮助,如果有疑问大家可以留言交流。
原文链接:http://www.2gua.info/post/72