list
list使用[]
,元素之间使用,
进行分割;是一种有序排列的数组。(本质上是一个栈)
特点
- list中元素按顺序有序排序;
- list索引映射唯一数据;
- list可以添加重复数据;
- list中任意数据类型可以混存;
- list可以根据需要动态分配和回收内存。
基本操作
创建
- 使用中括号[]
lst = ['hello','world',123]
- 调用内置函数list()
lst = list(['hello','world',123])
- 使用range()
lst = [i*i for i in range(0, 10)]
#返回结果[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
查询操作
获取指定元素的索引
index()函数:
- 如果列表中存在N个相同元素,只返回相同元素中的第一个元素的索引;
- 如果查询的元素在列表中不存在,运行时会报ValueError
- 可以在指定的start和stop之间进行查找
lst = ['hello', 'world', 123, 'world']
id = lst.index('world') #返回值为1
id = lst.index('python') #ValueError: 'python' is not in list
id = lst.index('world', 2, 4) #返回值为3
#index()第一个参数为要查找的值,第二个参数为start(包含start),第三个参数为stop(不包含stop)
获取列表中的单个元素
- 正向索引从0到n-1;
- 逆向索引从-n到-1;
- 指定索引不存在,运行时会报IndexError
获取列表中的多个元素
- 语法结构:
lst[start : stop : step]
- 切片结果:原列表片段拷贝
- 切片范围:[start, stop]
- step默认值为1;若step为正数,start默认为第一个元素,stop默认为最后一个元素;若step为负数,start默认为最后一个元素,stop默认为第一个元素。
判断指定元素是否存在
使用in或not in判断指定元素在列表中是否存在;
元素 in 列表; 元素 not in 列表
增加元素
- append():在列表的末尾添加一个元素
lst = [10, 20, 30]
lst.append(100) #此时列表为[10, 20, 30, 100]
- extend():在列表的末尾至少添加一个元素
lst1 = [10, 20, 30]
lst2 = [40, 50]
lst1.append(lst2) #若执行该步骤,则返回[10, 20, 30, [40, 50]]
lst1.extend(lst2) #若执行该步骤,则返回[10, 20, 30, 40, 50]
- insert():在列表的任意位置添加一个元素
lst = [10, 20, 30]
lst.inster(1, 90) #返回[10, 90, 20, 30]
- 切片:在列表的任意位置添加至少一个元素
lst = [10, 20, 30]
lst2 = [50, 60, 70]
lst[1:] = lst2 #返回[10, 50, 60, 70]
删除元素
- remove():一次删除一个元素;重复元素只删除第一个;元素不存在,则报错ValueError
lst = [10, 20, 30, 40, 20]
lst.remove(20) #返回[10, 30, 40, 20]
- pop():删除一个指定索引位置上的元素;指定索引不存在则报错IndexError
lst = [10, 20, 30, 40, 20]
lst.pop(1) #返回[10, 30, 40, 20]
注:默认删除列表的最后一个元素。
- 切片:一次至少删除一个元素
#产生一个新列表
lst = [10, 20, 30, 40, 20]
lst_new = lst[1:3]
#此时,lst = [10, 20, 30, 40, 20],lst_new = [20, 30]
#不产生新列表
lst = [10, 20, 30, 40, 20]
lst[1:3] = []
#返回结果:lst = [20, 30]
- clear():清空列表
- del:删除列表
lst = [20, 30]
del lst
修改
- 为指定索引的元素赋予一个新值
lst = [10, 20, 30, 40]
lst[1] = 50 #返回[10, 50, 30, 40]
- 为指定的切片赋予一个新值
lst = [10, 20, 30, 40]
lst[1:3] = [100, 200, 300, 400] #返回[10, 100, 200, 300, 400, 40]
排序
- 调用sort()方法,列表中的所有元素默认按照从小到大的顺序进行排列;当指定reverse=True,则按降序排序;
lst.sort()
- 调用内置函数sorted(),指定reverse=True,则按降序排序;原列表不发生改变,将会产生一个新的列表。
lst_new = sorted(lst)
时间复杂度
由于list的存储数据的复杂性,因此,在对list进行一些查询等基本操作时,时间复杂度为O(n);具体的各个操作的时间复杂度如下,n
是容器中当前的元素数,k
是需要操作的元素个数。
操作 | 时间复杂度 | 操作 | 时间复杂度 |
copy | O(n) | append | O(1) |
insert | O(n) | pop() | O(1) |
remove(i) | O(n) | pop(i) | O(n) |
delete | O(n) | extend | O(k) |
sort | O(nlogn) | in | O(n) |
min,max | O(n) | len | O(1) |
deque
deque是一种能在队列两端都进行入队、出队操作的数据结构,比普通的队列更加灵活也更加复杂。
基本操作
创建
d = collections.deque() #创建一个空队列
d = collections.deque(['a','b','c']) #从list创建
d = collections.deque(('a','b','c')) #从tuple创建
d = collections.deque({'a':0,'b':1,'c':2}) #从dict创建
d = collections.deque("abc") #从字符串创建
增加元素
d.append('d') #向右边增加一个元素'd'
d.appendleft('+') #向左边增加一个元素'+'
extend和extendleft,用于将一个可迭代对象的所有迭代值,依次加入到队列的右边或者左边
d1 = collections.deque()
d1.extend("123") #输出结果为:deque(['1', '2', '3'])
d2 = collections.deque()
d2.extendleft("123") #输出结果为:deque(['3', '2', '1'])
删除元素
d.pop() #从右边删除一个元素
d.popleft() #从左边删除一个元素
时间复杂度
操作 | 时间复杂度 | 操作 | 时间复杂度 |
copy | O(n) | append | O(1) |
extend | O(k) | appendleft | O(1) |
extendleft | O(k) | pop | O(1) |
remove | O(n) | popleft | O(1) |
set
set使用()
,是一种无序数组,set中的内容不能重复。
基本操作
创建
s = set()
s = set(['a', 'b', 'c'])
s = set([('a', 1), ('b', 2), ('c', 3)])
增加元素
s = set(['a', 'b', 'c'])
s.add('d')
删除元素
s = set(['a', 'b', 'c'])
s.remove('c')
查询
使用in或not in判断指定元素在列表中是否存在;
元素 in 列表; 元素 not in 列表
时间复杂度
操作 | 时间复杂度 | 操作 | 时间复杂度 |
in | O(1) | add | O(1) |
pop() | O(1) | pop(i) | O(n) |
remove(i) | O(n) | iteration | O(n) |
dict
dict是以键值对的方式存储数据,字典是一个无序的序列;
dict的存储是将key通过hash函数计算位置,然后将其放到对应位置中;
dict是根据key查找value所在的位置。
dict的查找效率是非常高的,其查找过程是将key通过hash函数计算得到位置,然后取出对应的值。
特点
- dict中的所有元素都是键值对,key不能重复,但value可以重复
- dict中的元素是无序的
- dict中的key必须是不可变对象(例如int,str;list是可变对象,因此不能作为key)
- dict可以根据需要动态地伸缩
- dict会浪费较大的内存,是一种使用空间换时间的数据结构
基本操作
创建
- 常用方式:使用花括号;
#冒号左边为key,右边为value
student = {'name': '张三', 'age': 30}
- 使用内置函数dict()
#等号左边为key,右边为value
student = dict(name = '张三', age = 30)
取值
- 使用[]进行取值:如果字典中不存在指定的key,则输出keyError;
student = {'name': '张三', 'age': 30}
nm = student[name] #返回结果为'张三'
sx = student[sex] #输出keyError
- get()方法:如果字典中不存在指定的key,则返回None
student = {'name': '张三', 'age': 30}
nm = student.get('name') #返回结果为'张三'
sx = student.get('sex') #返回结果为None
sc = student.get('score', 100) #返回结果为100,但该键值对不会新增到字典中
key的判断
- in:指定的key在字典中存在,返回True;
- not in:指定的key在字典中不存在,返回False。
增加元素
student = {'name': '张三', 'age': 30}
student['sex'] = '女'
删除元素
- 删除指定的键值对
student = {'name': '张三', 'age': 30}
del student['name'] #将key为name的键值对删除
- 清空字典的元素
student = {'name': '张三', 'age': 30}
student.clear()
修改
student = {'name': '张三', 'age': 30}
student['age'] = 20
时间复杂度
操作 | 时间复杂度 | 操作 | 时间复杂度 |
in | O(1) | copy | O(n) |
add | O(1) | del | O(1) |
iteration | O(n) |