Python 列表大法
列表和字典占据了我们编程的大部分,这篇我们重点来分享列表。
0. 内建常用数据结构:
内建常用数据结构有两种。在学习列表之前,我们首先要定位列表属于顺序表。:
- 序列sequence
- 字符串str,字节序列byte、bytearray
- 列表list、元组tuple
- 键值对
- 集合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
栈和队列
- 栈:后进先出,在内存上有两种内部实现,可以是列表或者链接表,效率基本相同。
- 队: 先进先出队列一般不用列表,而是用链表。
- 今日学习计划