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

yipeiwu_com6年前Python基础

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

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

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

官方文档对__getitem__的解释:

简而言之,其主要用来获取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)

总结

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

相关文章

部署Python的框架下的web app的详细教程

部署Python的框架下的web app的详细教程

作为一个合格的开发者,在本地环境下完成开发还远远不够,我们需要把Web App部署到远程服务器上,这样,广大用户才能访问到网站。 很多做开发的同学把部署这件事情看成是运维同学的工作,这种...

python MysqlDb模块安装及其使用详解

python MysqlDb模块安装及其使用详解

python调用mysql数据库通常通过mysqldb模块,简单说下如何调用 1.安装驱动 目前有两个MySQL的驱动,我们可以选择其中一个进行安装: 1. MySQL-pytho...

Python三元运算实现方法

本文实例讲述了Python三元运算实现方法。分享给大家供大家参考。具体分析如下: Python中没有像C++和Java等语言中的三元运算符,但是可以用if else语句实现相同的功能:...

详解PyTorch手写数字识别(MNIST数据集)

详解PyTorch手写数字识别(MNIST数据集)

MNIST 手写数字识别是一个比较简单的入门项目,相当于深度学习中的 Hello World,可以让我们快速了解构建神经网络的大致过程。虽然网上的案例比较多,但还是要自己实现一遍。代码采...

pd.DataFrame统计各列数值多少的实例

如下所示: .count() #非空元素计算 .min() a #最小值 .max() #最大值 .idxmin() #最小值的位置,类似于R中的which.min函...