3. 数组和列表

先说基本的线性结构,常用的就是线性结构,也是比较简单的,特点如下:

内存连续,一开始就会分配一块固定的内存给它,可以通过下标去快速访问常用的数组和列表。

在python 里面有array和list两种

Array:

python中array用到的机会没有list多,

先演示一下array的用法(https://docs.python.org/2/library/array.html):

from array import array

arr = array('u', 'abcdefg')
print (arr[0])
print (arr[3])
print (arr[5])

结果:

a

d

f

缺点也比较明显:

(1)只能存同一种类型,不想list可以在不同下标存不同类型的元素;

(2)只能存一些比较基本的数值、字符类型,用得不是很多,一般用numpy里面的array,来做一些数值的处理。

List:

list也是一个线性结构

(1)list的工作过程

通过C解释器代码可以看到是按照 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ....的顺序增长的

https://github.com/python/cpython/blob/master/Objects/listobject.c

append:

操作 内存分配策略 平均时间复杂度
init[] *  pylistobj O(1)
append(0)

append(0)会分配4个pylistobj,不会一次只分配一个,会占用空间

当分配足够的空间,时间复杂度是O(1),否则它就会重新开辟并拷贝原来的数据到新开辟的空间中去,这时就会退化,时间复杂度是O(n)
append(1)
append(2)
append(3)

append(4)
当超出它的大小限制的时候,会进行一个resize的操作,因为不够装了,所以重新分配8个空间

insert:

insert
insert 一般会往中间插入,这样会比较耗费时间,会重新进行内存分配,比如insert一个元素 -1,这时就要重新开辟空间,总长度就变成了16


数组的容量称为capacity(总内存分配的容量),而length指的是有多少个元素,比如之前append了5个元素,insert一个-1,这时length就是6,即6个元素,而capacity是16,所以insert操作会重新的去分配,所以他的时间复杂度平均下来是O(n)

O(n)

pop:

pop
pop默认是移除最后一个元素,所以时间复杂度是O(1)


因为只是要把第5位指针往前面移动一位,这时length的长度变成5个,时间复杂度O(1);

但如果从中间进行pop的时候,这样就会把后面的元素往前移,这时候时间复杂度就会退化,变成O(n).


O(1)

O(n)

remove:

remove

加入要把中间的元素删除掉,要把后面的每一个元素全都往前移,这时候的时间复杂度是O(n)

O(n)

如图:

操作 平均时间复杂度
list[index] O(1)
list.append O(1)
list.insert O(n)
list.pop(index), default last element O(1)
list.remove O(n)

所以在用list的时候,频繁的进行insert/remove的时候,或是在中间进行pop的话,

可能list就不是一个合适的数据结构,要选用其他更高效的数据结构。

练习:用list实现array的ADT

实现一个定长的数组array的ADT

ps:在其他一些语言中,内置的数组结构就是定长的。

class Array(object):
    def __init__(self, size=32):
        self._size = size
        self._items = [None] * size     #定义一个长度为size,元素是none的列表

    def __getitem__(self, index):
        return self._items[index]       #定义方法,可以通过[index]进行获取元素

    def __setitem__(self, index, value):
        self._items[index] = value

    def __len__(self):
        return self._size

    def clean(self, value=None):        #清空数组
        for i in range(len(self._items)):
            self._items[i] = value

    def __iter__(self):
        for item in self._items:
            yield item

#单测(pip install pytest)
def test_array():
    size = 10           #指定size长度
    a = Array()         #实例化
    a[0] = 1            #set方法
    assert a[0] == 1    #get方法

    a.clean()           #clean方法
    assert a[0] is None #clean方法

#pytest array_list.py

原文地址:http://blog.51cto.com/286577399/2148991

时间: 2024-11-13 07:56:39

3. 数组和列表的相关文章

java中数组,列表,集合的基本用法

import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class shuzu { public static void main(String[] args){ //数组 array(); //列表 list(); //集合 map(); } public static void array(){ int[] a=new int[]{0,1

Java数组与列表转换的java.lang.ClassCastException

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer; at com.bupt.acm.test.TestArrayList.main(TestArrayList.java:12) ava.lang.ClassCastException是进行强制类型转换的时候产生的异常,强制类型转换的前提是父类引用指向的对象的类

原生js实现ajax和将数组以列表形式显示出来

<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <script type="text/javascript"> function go(arrs){ //将一个字符串解析后放入ul标签中 var node=document.getElementById('list').firstChild; node.appendData('\n'); for(v

数组与列表相互转换

受 宗策的集合转换为数组TOARRAY() 启发,编写列表与数组互转代码.代表如下 public static void main(String[] args) { // 列表转换为数组 List<String> c=new ArrayList<>(); c.add("A"); c.add("B"); c.add("D"); c.add("E"); c.add("F"); //列表

python学习:数组之列表推导

先来看一个例子:取数组中的偶数的一般做法 如果使用列表推导的话,实现起来很简单: 再举个例子,如果想把数组中每个元素都乘以2的话: array = [1,2,3,4,5,6,7] result = [i * 2 for i in array] print result 列表推导式书写形式: [表达式 for 变量 in 列表]    或者  [表达式 for 变量 in 列表 if 条件]

数组与列表

数组长度元素内容不可变 int[] i=new int[12]//动态初始化  int i[]={1,2,3} 列表灵活性更强,可以方便的进行增.add()   .remove(index)  .set(index,new_value)   .contains()

R语言基础-数组和列表

数组(array) 一维数据是向量,二维数据是矩阵,数组是向量和矩阵的直接推广,是由三维或三维以上的数据构成的. 数组函数是array(),语法是:array(dadta, dim),当中data必须是同一类型的数据.dim是各维的长度组成的向量. 1.产生一个三维和四维数组. 例1:xx <- array(1:24, c(3, 4, 2)) #一个三维数组 例2:yy <- array(1:36, c(2, 3, 3, 2)) #一个四维数组 2.dim()函数可将向量转化成数组或矩阵. 例

scala的数组、列表、元组、集、映射

数组: 数组的值可以改变但是数组的名不能改变: eg:     scala> val gg = Array("ssss","ddddd")(数组的定义)    scala>val grre = Array(1,2,3)    scala> grre    res12: Array[Int] = Array(1, 2, 3)    scala> grre = gg    <console>:9: error: reassignmen

python_S13_02[数组、列表、元组]

一.对python中.pyc的理解 1).pyc文件可以理解为是python编译好的字节码文件,即只有python解释器才能读懂,类似于java中class文件 2)python运转过程: 当python程序运转时,编译的结果是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中 当程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如找到,则直接载入,否则就重复上面的过程. 总结:PyCodeObject和