Python 101 列表增删改查常用操作及效率


列表和字典占据了我们编程的大部分,这篇我们重点来分享列表。

0. 内建常用数据结构:

内建常用数据结构有两种。在学习列表之前,我们首先要定位列表属于顺序表。:

  1. 序列sequence
    • 字符串str,字节序列byte、bytearray
    • 列表list、元组tuple
  2. 键值对
    • 集合set
    • 字典dict

线性数据结构

线性表:

  • 有有穷个元素组成;

顺序表:

  • 使用一大块连续内存存储表中的元素

链接表

  • 链表之间的联系不是像顺序表,一个挨着一个摆放,他们是散放的,分布是不均匀的。他们前一个知道下一个的内存地址,他们就是靠这种关系关联起来的;那么为了找到下一个元素,就需要按照地址顺序查找,这种遍历因为是按照地址顺序查找的,所以速度还可以,不过要考虑数据量大的情况;
  • 分散存储的元素链接起来。链表节点的实现
class Node(object):
    """节点"""
    def __init__(self, elem):
        self.elem = elem
        self.next = None

1. Python list列表的属性

列表的特征
  • 列表是可索引的 --说明列表里面元素是有序排列的。
  • 列表是可变
  • 列表可遍历–说明列表是容器。
  • 列表是有序的–说明列表是用顺序表实现的。
  • 列表是线性表

列表的索引

正索引:从做到右,从0开始 [0, len()-1]
负索引:从右到左,从-1开始 [-len(), -1]
索引定位的时间复杂度O(1),是列表最好的使用方式。
在这里插入图片描述

Python列表的增删改查脑图(双击查看大图):

在这里插入图片描述

2. Python列表的查询

     2.1 index

     2.2 count

index和count能少用则少用

     2.3 len

在这里插入图片描述

查询 方法 原理 复杂度 代码片
index index(value,start,[stop]) 通过value值,从指定区间查找列表内的元素是否匹配;匹配到第一个就立即返回索引;匹配不到,抛出异常ValueError O(n),即随着列表数量规模的增大,复杂度增高 On a = [1,2,4,‘a’] print(a.index(99))
count count(value) 返回列表中匹配Value的次数(重复次数查询) O(n),即随着列表数量规模的增大,复杂度增高 O n a = [1,2,2,4,‘a’] a.count(2) print(a.count(2))
// index 例子
a = [1,2,3,4]
print(a.index(99)>>> ValueError

3. Python list列表的修改


3.1. append insert 和extend

     3.1.1 insert

insert() 函数用于将指定对象插入列表的指定位置。

语法
insert()方法语法:
list.insert(index, obj)

参数
index – 对象 obj 需要插入的索引位置。
obj – 要插入列表中的对象。

返回值
该方法没有返回值,但会在列表指定位置插入对象。
list.append(object) 向列表中添加一个对象object;
list.extend(sequence) 把一个序列seq的内容添加到列表中。

insert() 函数用于将指定对象插入列表的指定位置。
在这里插入图片描述

music_media = ['compact disc', '8-track tape', 'long playing record']
new_media = ['DVD Audio disc', 'Super Audio CD']
music_media.append(new_media)
print music_media
>>>['compact disc', '8-track tape', 'long playing record', ['DVD Audio disc', 'Super Audio CD']]

3.1.2 append

定位时间复杂度是O(1)。
使用append的时候,是将new_media看作一个对象,整体打包添加到music_media对象中。

music_media = ['compact disc', '8-track tape', 'long playing record']
new_media = ['DVD Audio disc', 'Super Audio CD']
music_media.extend(new_media)
print music_media
>>>['compact disc', '8-track tape', 'long playing record', 'DVD Audio disc', 'Super Audio CD']

3.1.3 extend

使用extend的时候,是将new_media看作一个序列,将这个序列和music_media序列合并,并放在其后面。


3.2. *是浅拷贝

在这里插入图片描述
深拷贝引用模块copy:

在这里插入图片描述

    3.3 + 拼接

在这里插入图片描述
在这里插入图片描述

3.4 * 是将列表里面的元素重复3次

在这里插入图片描述

4. Python list列表的删除

练习环境:

str="周一不加班"
list= list(str)
list.pop()
list.remove("一")
list.insert(1,'周')
list.append('班')
print(list)

4.1 删除Remove(by元素)

Remove没有返回值:

str="周一不加班"
list= list(str)
return_remove= list.remove('一')
print(return_remove)

4.2 删除POP (by下标)

str="周一不加班"
list= list(str)
return_pop= list.pop(2)
print(return_pop)

4.3 clear

清除所有元素,剩下空列表,虽然效率很高,但是好不容易生成在内存的数据,为什么突然要使用clear

Python 中一切皆对象,而对象都是引用类型, 可以理解为一个地址指针指向这个对象。
但是字面常量字符串、数值等表现,不像引用类型,暂时可以理解为简单类型。
而列表、元组、字典,已经后续的类和实例都是引用类型。
可以认为简单类型直接存在列表中,而一弄类型质数把引用地址存在了列表中

5. Sort和Sorted 排序

5.1使用sort排序

默认是升序,如果降序则加reverse = Ture:
在这里插入图片描述
如果要比较字符,加key=str
在这里插入图片描述
对字符数字进行排序:
在这里插入图片描述

使用sort()方法对list排序会修改list本身,不会返回新list,通常此方法不如sorted()方便,但是如果你不需要保留原来的list,此方法将更有效sort()。

sort()不能对dict字典进行排序

sort() 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。

语法:
list.sort( key=None, reverse=False)
参数:
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序, reverse = False 升序(默认)。
返回值
该方法没有返回值,但是会对列表的对象进行排序。

5.2 使用sorted()排序

my_list = [3, 5, 1, 4, 2]
result = sorted(my_list)
print result

#输出: [1, 2, 3, 4, 5]

5.3. 反转 Reverse

将元素反转
在这里插入图片描述
Python列表操作的时间复杂度:
在这里插入图片描述
Python字典操作的时间复杂度:1

在这里插入图片描述

栈和队列

  • 栈:后进先出,在内存上有两种内部实现,可以是列表或者链接表,效率基本相同。
  • 队: 先进先出队列一般不用列表,而是用链表。
  • 今日学习计划

  1. 时间复杂度测量方法
    在这里插入图片描述 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章