python列表获取元素_Python中二维列表如何获取子区域元素的组成

用过NumPY的应该都知道,在二维数组中可以方便地使用区域切片功能,如下图:

2017119142208466.png?2017019142218

而这个功能在Python标准库的List中是不支持的,在List中只能以一维方式来进行切片操作:

2017119142236391.png?2017019142245

但有时候我只想用一下这个功能,但又不想引入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])

2017119142331845.png?2017019142339

官方文档对__getitem__的解释:

2017119142353163.png?201701914242

简而言之,其主要用来获取self[key]的值。

我在这里为了突出问题解决,只列出了关键代码,异常判断、边界检查、条件限制,甚至其他一些特殊方法如__setitem__ 、 __delitem__与__len__等代码,需视实际情况添加。

当然,也有其他处理方式,如以下所示代码,但不同方法无疑给了我各种场景下的多种选项。

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)

2017119142500138.png?201701914258

总结

以上就是这篇文章的全部内容了,Python编程一个吸引我的地方就是,它就像是一座金矿,挖着挖着很可能就挖出些意想不到的乐趣出来。希望本文的内容对大家学习或者使用python能有一定的帮助,如果有疑问大家可以留言交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值