Python线性数据结构-列表list

一、Python内置数据结构

  1、分类:

  数值型

  int、float、complex、bool

  int:Python3的int就是长整型、而且没有大小限制,受限于内存区域的大小,示例:1

  float:由整数部分和小数部分组成,支持十进制和科学计数法的表示,示例:5.0

  complex:有实数和虚数部分组成,实数和虚数部分都是浮点数,示例:3 + 5j

  类型转换:

   int(x):返回一个整数

  float(x):返回一个浮点数

  complex(x):返回一个复数

  bool(x):返回布尔值

  序列

  字符串str、bytes、bytearray

  列表list、元组tuple

  键值对

  集合set、字典dict 

  

  2、数字的处理函数

   在使用之前需要导入math函数,主要有floor() 、ceil()、int()、round() // 

  

 

 

   如上述示例,则能总结出:运算符 // 取整是向下取整,而floor()则是向下、celi()向上取整。  

   int则是取整数部分,不管小数部分的大小,round()模块则是4舍6入5取最近的偶数。

  

 

 

    import math 

  有如下函数:math.pi 3.14   math.sqrt 开方等

 

  3、类型的判断

   type(obj),返回类型,而不是字符串

   isinstance(obj,class or tuple)返回bool值

   id 则是用来查看内存地址

  

 

 

   4、列表

   定义:一个队列,一个排列整齐的队列,列表内的个体称为元素,由诺干个元素组成列表,元素可以是任意对象(数字,字符串,列表,对象等)

       列表内的元素是有顺序的,可以使用索引,线性数据结构,使用[]表示空列表,列表是可变的。

  列表list 、链表 linked、队列queue、 stack栈的差异:

  列表:连续的内存空间,有序的,可索引的,追加(O(1)),查询都很快(通过索引值,偏移量),但是删除、增加元素,比较慢,需要遍历元素
  链表:非连续的内存空间,但是也是有序的,可以索引(在内存空间中是散落的,但是内存地址不是连续的),查询比较慢,都得从开头找,插队,删除都比较快,只需要找前后的内存地址就可以。
  队列:先进先出,基于地址指正遍历数据可以从进的一端或者出的一端 ,但是不能同时访问,不需要开辟新的空间
  栈:后进先出,遍历数据只能从入口端遍历,如果查找一个最先放进去的数据,需要遍历所有的数据,同时遍历数据需要开辟新的内存空间

  列表的声明方式有两种:[]  list(可迭代对象) 表示。示例: list(range(10))

  列表是容器,可容纳其他的元素:

  

 

 

   列表的索引访问:

  索引,也叫下标,从0开始,到长度减去一;分为正索引和负索引,负索引从-1开始,正负索引不可超界,否则发生异常,indexError .

  

 

 

   列表查询:

  L.index(value, [start, [stop]]),通过value,从指定的区间查找列表内的元素是否匹配,匹配到第一个就立刻返回索引位置
  匹配不到抛出异常

  

 

 

   

  L.count(value):返回列表中匹配的value的次数  

  

 

 

   index和count的时间复杂度都为O(n),会随着规模的增大效率下降,建议少用。

  如何返回列表表示元素的个数?则用到了len()函数,其时间复杂度为O(1)  默认不需要遍历,会在列表最后有记录

  

  列表元素修改:

    索引访问修改:

       list [ index ] = value  注:index不能越界,抛出 IndexError异常,效率高

  

  列表的增加和插入:

  append():列表尾部追加元素,返回None,就地修改,一次只能插一个元素,时间复杂度为O(1)

  insert():在指定的索引处插队,就地修改,但如果插队的位置除了队尾其余任何地方都会导致列表元素额挪动,若规模庞大,效率不高,不建议使用。时间复杂度为O(n)

  insert超界:

    超过上界限,尾部追加

    超过下界,头部追加

  插队一定是插在别人的前面

  

 

  列表增加多个元素:

  extend(iteratable):可迭代对象,就地修改。

  + ->list :连接操作,将两个列表连接起来,产生新的列表,原来的列表不变,调用了__add__()魔术方法

  * ->list :重复操作,将本列表元素重复n次,返回新的列表

  

   列表复制的坑:深浅复制问题

x = [[1,2,3]] * 3
print(x)
x[0][1] = 200
print(x)
print('----------------')
y = [1] * 3 
print(y)
y[0] = 6666
y[2] = 777
print(y)

 

  

 

  

 

   列表的删除元素:

  remove(value):从左边往右查找第一个匹配的元素的值,找到就移除该元素,并且返回None,就地修改,效率不高。

  pop():不指定索引就从尾部弹出一个元素,指定索引就从索引处弹出一个元素,索引不可超界,尾部弹出效率还可以,如果在中间,则效率不高。

  clear():清除列表所有元素,剩余一个空列表,效率OK,但是慎用

  

 

 

   列表的其他操作:

  reverse():列表反转,返回None,就地修改

  sort():对列表进行排序,就地修改,默认为升序,lst1.sort(reverse = True) 则为降序

  in :判断列表是否在列表中

  

  

 

a = list(range(10))
b = list(range(10))
print(a == b)
c = a
c[2] = 200
print(a, c)

print(a == c)
print(a is c)
print(id(a), id(c), id(b))

 

 

 

   列表复制:

  shadow copy返回一个新的列表,如列表里面嵌套列表,copy一个新列表后内存地址未发生改变,修改则会将两列表值修改。

a = list(range(10))
b = a.copy()
print(a == b)
b[2] = 200 
print(a == b)
a,b

 

 

 

   deepcopy(),深拷贝:

  

import copy
a = [1,2,[12,13,14],4,5]
b = copy.deepcopy(a)
b[2][2] = 1400
print(a,b)
print(a == b)

 

 

   

 

posted @ 2020-03-23 10:11  Alrenn  阅读(669)  评论(0)    收藏  举报