专栏首页Python小屋封装Python列表实现多下标访问

封装Python列表实现多下标访问

class MyArray(object):

def __init__(self, values):

#values can be of any kinds which can be converted into list

self.__data = list(values)

#多下标访问列表元素

def __getitem__(self, index):

length = len(self.__data)

#index can be an integer

if isinstance(index, int) and index<length:

return self.__data[index]

#index can also be a list/tuple which has many integers

elif isinstance(index, (list,tuple)):

#ensure that all integers given must < the length of data

for i in index:

if not (isinstance(i,int) and i<length):

return 'index error'

result = []

for item in index:

result.append(self.__data[item])

return result

else:

return 'index error'

#多下标元素赋值

def __setitem__(self, index, value):

length = len(self.__data)

if isinstance(index, int) and index<length:

self.__data[index] = value

elif isinstance(index, (list,tuple)):

for i in index:

if not (isinstance(i,int) and i<length):

raise Exception('index error')

if isinstance(value, (list,tuple)):

if len(index) == len(value):

for i, v in enumerate(index):

self.__data[v] = value[i]

else:

raise Exception('values and index must be of the same length')

elif isinstance(value, (int,float,complex,str)):

for i in index:

self.__data[i] = value

else:

raise Exception('value error')

else:

raise Exception('index error')

def __repr__(self):

return str(self.__data)

用法演示:

>>> from myArr import MyArray

>>> x = MyArray(range(20))

>>> x

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

>>> x[3]

3

>>> x[3] = 'a'

>>> x

[0, 1, 2, 'a', 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

>>> x[[3,3,5]]

['a', 'a', 5]

>>> x[[3,3,5]] = ['test', 'hello', 100]

>>> x

[0, 1, 2, 'hello', 4, 100, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

>>> x[[1,3,5]] = ['test', 'hello', 100]

>>> x

[0, 'test', 2, 'hello', 4, 100, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

>>> x[100]

'index error'

>>> x[100] = 3

Traceback (most recent call last):

File "<pyshell#90>", line 1, in <module>

x[100] = 3

File "C:/Python35\myArr.py", line 44, in __setitem__

raise Exception('index error')

Exception: index error

>>> x[[1,100]] = 3

Traceback (most recent call last):

File "<pyshell#91>", line 1, in <module>

x[[1,100]] = 3

File "C:/Python35\myArr.py", line 31, in __setitem__

raise Exception('index error')

Exception: index error

>>> x[list(range(20,2))] = 0

>>> x

[0, 'test', 2, 'hello', 4, 100, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

>>> y=list(range(20,2))

>>> x[y] = 0

>>> x

[0, 'test', 2, 'hello', 4, 100, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

>>> x[[1,3,5,7,9]] = 0

>>> x

[0, 0, 2, 0, 4, 0, 6, 0, 8, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

本文分享自微信公众号 - Python小屋(Python_xiaowu),作者:董付国

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-07-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python实现字符串与指定密钥循环异或加解密

    异或运算在很多密码学算法中都有不同程度的应用,其运算特定在于一个数和另一个数连续异或两次仍得到原来的数。在实际使用中,因为要加密的信息和所使用的密钥在大多数情况...

    Python小屋屋主
  • Python使用筛选法计算小于给定数字的所有素数

    代码思路:首先列出指定范围内所有候选数字,然后从前往后依次选择一个数字去除以后面所有数字,能够被整除的肯定不是素数,把这些数字过滤掉,然后重复这个过程,直到选择...

    Python小屋屋主
  • Python版双链表结构与有关操作

    接昨天文章详解Python变量作用域最后的思考题。 class Node: '''节点结构''' def __init__(self, data, left...

    Python小屋屋主
  • Elasticsearch——禁止Body中的index覆盖Url中的index参数

    本篇继续一下Elasticsearch日常使用的技巧翻译。 在Elasticsearch有很多的api支持在body中指定_index等信息,比如mget...

    用户1154259
  • Apache2为什么会自动加载index.php

    我直接输入域名后,Apache2自动加载了对应目录下的index.php, 这是怎么做到的?

    Jerry Wang
  • 小朋友学Python Web(1):建立第一个Web项目

    一、 安装PyCharm专业版 注意不要安装社区版,因为社区版没有集成Django框架,得自己安装配置,过程比较繁琐

    海天一树
  • ES运维实战之系统性能调优

    文件句柄 Linux中,每个进程默认打开的最大文件句柄数是1000,对于服务器进程来说,显然太小,通过修改/etc/security/limits.conf来增...

    暴走大数据
  • 【AlexeyAB DarkNet框架解析】七,YOLOV1损失函数代码详解(detection_layer.c)

    灵魂拷问,你真的懂YOLOV1的损失函数吗?进一步,懂了损失函数,你清楚它的反向求导过程吗?为了解决这俩问题,本文就结合DarkNet中的YOLOV1的损失函数...

    BBuf
  • Python_二维数组

    py3study
  • 【每天一道编程系列-2018.2.20】(Ans)

      The string “PAYPALISHIRING” is written in a zigzag pattern on a given number ...

    yesr

扫码关注云+社区

领取腾讯云代金券