python数据结构学习笔记-2016-10-14-01-一维数组
来源:互联网 发布:java特种兵 下册出了吗 编辑:程序博客网 时间:2024/05/15 16:18
2.1 数组结构
一维数组(one-dimensional array)是多个元素按照一定的顺序,储存在内存的连续的字节当中,并允许对每一个元素的任意访问。
对数组中元素的访问,是通过指针来完成。(类似于数学中的下标)
2.1.1 为什么学习数组
数组与python中列表的区别:
- 数组的相关操作较少,而列表的操作较多;(感觉挺牵强的)
- 数组一经创建,其长度不能改变,而列表可以随意增删元素,甚至将另一个列表合并进来,即列表的长度是可变的。(主要区别)
- 数组占用的内存空间较小,而列表占用的内存空间较大,往往比列表本身的长度要打,这也是列表长度可变的原因。
在解决问题时,采用数组还是列表,得依据问题而定。数组适合于已知序列最大长度的相关问题,而列表适用于长度会发生变化的问题。
2.1.2 数组ADT
数组ADT含有以下方法:
- Array(size):创建长度为size的数组,并将数组中每一个元素初始化为None;
- length():获取数组长度;
- getitem(index):返回指针index指向的数组元素,可通过[]操作符实现对元素的访问;
- setitem(index, value):将给定指针index指向的数组元素赋值为value;
- clear(value):将整个数组的元素全部赋值为value;
- iterator():创建迭代器。
#-*-coding: utf-8-*-# 创建定长数组,填入随机数,并打印数组from myarray import Arrayimport randomvalueList = Array(100)for i in range(len(valueList)): valueList[i] = random.random()for value in valueList: print value
#-*-coding: utf-8-*-# 数文件中每个字母出现次数,可打印的ASCII字符共有127个,因此可以使用数组,将每个字母出现的次数存入数组的每一项中。from myarray import ArraytheCounters = Array(127)theCounters.clear(0)theFile = open('atextfile.txt', 'r')for line in theFile: for letter in line: code = ord(letter) theCounters[code] += 127theFile.close()for i in range(26): print "%c - %4d\t%c - %4d" % (chr(65+i), theCounters[65+i], chr(97+i), theCounters[97+i])
2.1.3 实现数组ADT
ctypes模块
这一模块为python使用者访问并使用C语言及其相关库中提供的多种数据类型。我们用这一模块来在python中实现数组ADT。
#-*-coding: utf-8-*-# 使用ctypes模块实现数组ADTimport ctypesclass Array(object): # 通过长度创建数组 def __init__(self, size): assert size > 0, "Array size must be > 0" self._size = size # 创建数组 PyArrayType = ctypes.py_object * size self._elements = PyArrayType() # 对每个元素初始化为None self.clear(None) def __len__(self): return self.size # 通过指针访问元素 def __getitem__(self, index): assert 0 <= index < len(self), "Array subscript out of range" return self._elements[index] # 将值放入数组的指定的元素中 def __setitem__(self, index, value): assert 0 <= index < len(self), "Array subscript out of range" self._elements[index] = value # 清空数组中的所有值,并将所有元素设为给定值 def clear(self, value): for i in range(len(self)): self._elements[i] = value # 返回数组的迭代器,以便用于遍历元素 def __iter__(self): return _ArrayIterator(self._elements)# 数组的迭代器class _ArrayIterator(object): def __init__(self, theArray): self._arrayRef = theArray self._curNdx = 0 def __iter__(self): return self def __next__(self): if self._curNdx < len(self._arrayRef): entry = self._arrayRef[self._curNdx] self._curNdx += 1 return entry else: raise StopIteration
0 0
- python数据结构学习笔记-2016-10-14-01-一维数组
- python数据结构学习笔记-2016-10-14-03-二维数组
- python数据结构学习笔记-2016-10-17-03-多维数组
- python数据结构学习笔记-2016-10-05-01-抽象数据类型(一)
- python数据结构学习笔记-2016-10-14-02-python列表
- python数据结构学习笔记-3-数组
- python数据结构学习笔记-2016-11-14-01-散列表
- python数据结构学习笔记-2016-10-15-01-矩阵ADT
- python数据结构学习笔记-2016-10-17-01-集合
- python数据结构学习笔记-2016-10-21-01-复杂度分析
- python数据结构学习笔记-2016-10-23-01-搜索
- python数据结构学习笔记-2016-10-24-01-排序列表
- python数据结构学习笔记-2016-10-27-01-链表
- python数据结构学习笔记-2016-12-10-01-AVL树
- 数据结构学习笔记(一):数组及查找算法
- 学习Javascript数据结构与算法系列笔记(一):数组
- python学习笔记-数据结构
- 数据结构学习笔记(一)
- iOS应用安全读书笔记之短信
- 第八周项目3 -顺序库算法
- 论事件驱动与异步IO
- JPEGImageEncoder编译报错问题
- 为什么fork创建子进程后,父进程中运行过的代码在子进程中不再运行了
- python数据结构学习笔记-2016-10-14-01-一维数组
- Android Service的启动过程
- how to fix GIT error: object file is empty?
- 6骰子(1)
- maven的插件配置
- HDU 1576 扩展欧几里得
- 线性筛
- javafx之TableView的TableColumn
- 409. Longest Palindrome