list

list使用[],元素之间使用,进行分割;是一种有序排列的数组。(本质上是一个栈)

特点

  1. list中元素按顺序有序排序;
  2. list索引映射唯一数据;
  3. list可以添加重复数据;
  4. list中任意数据类型可以混存;
  5. list可以根据需要动态分配和回收内存。

基本操作

创建

  1. 使用中括号[]
lst = ['hello','world',123]
  1. 调用内置函数list()
lst = list(['hello','world',123])
  1. 使用range()
lst = [i*i for i in range(0, 10)]
#返回结果[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

查询操作

获取指定元素的索引

index()函数:

  1. 如果列表中存在N个相同元素,只返回相同元素中的第一个元素的索引;
  2. 如果查询的元素在列表中不存在,运行时会报ValueError
  3. 可以在指定的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)
获取列表中的单个元素
  1. 正向索引从0到n-1;
  2. 逆向索引从-n到-1;
  3. 指定索引不存在,运行时会报IndexError
获取列表中的多个元素
  1. 语法结构:
lst[start : stop : step]
  1. 切片结果:原列表片段拷贝
  2. 切片范围:[start, stop]
  3. step默认值为1;若step为正数,start默认为第一个元素,stop默认为最后一个元素;若step为负数,start默认为最后一个元素,stop默认为第一个元素。
判断指定元素是否存在

使用in或not in判断指定元素在列表中是否存在;

元素 in 列表; 元素 not in 列表

增加元素

  1. append():在列表的末尾添加一个元素
lst = [10, 20, 30]
lst.append(100)		#此时列表为[10, 20, 30, 100]
  1. extend():在列表的末尾至少添加一个元素
lst1 = [10, 20, 30]
lst2 = [40, 50]
lst1.append(lst2)	#若执行该步骤,则返回[10, 20, 30, [40, 50]]
lst1.extend(lst2)	#若执行该步骤,则返回[10, 20, 30, 40, 50]
  1. insert():在列表的任意位置添加一个元素
lst = [10, 20, 30]
lst.inster(1, 90)	#返回[10, 90, 20, 30]
  1. 切片:在列表的任意位置添加至少一个元素
lst = [10, 20, 30]
lst2 = [50, 60, 70]
lst[1:] = lst2 		#返回[10, 50, 60, 70]

删除元素

  1. remove():一次删除一个元素;重复元素只删除第一个;元素不存在,则报错ValueError
lst = [10, 20, 30, 40, 20]
lst.remove(20)		#返回[10, 30, 40, 20]
  1. pop():删除一个指定索引位置上的元素;指定索引不存在则报错IndexError
lst = [10, 20, 30, 40, 20]
lst.pop(1)		#返回[10, 30, 40, 20]

注:默认删除列表的最后一个元素。

  1. 切片:一次至少删除一个元素
#产生一个新列表
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]
  1. clear():清空列表
  2. del:删除列表
lst = [20, 30]
del lst

修改

  1. 为指定索引的元素赋予一个新值
lst = [10, 20, 30, 40]
lst[1] = 50		#返回[10, 50, 30, 40]
  1. 为指定的切片赋予一个新值
lst = [10, 20, 30, 40]
lst[1:3] = [100, 200, 300, 400] 	#返回[10, 100, 200, 300, 400, 40]

排序

  1. 调用sort()方法,列表中的所有元素默认按照从小到大的顺序进行排列;当指定reverse=True,则按降序排序;
lst.sort()
  1. 调用内置函数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函数计算得到位置,然后取出对应的值。

特点

  1. dict中的所有元素都是键值对,key不能重复,但value可以重复
  2. dict中的元素是无序的
  3. dict中的key必须是不可变对象(例如int,str;list是可变对象,因此不能作为key)
  4. dict可以根据需要动态地伸缩
  5. dict会浪费较大的内存,是一种使用空间换时间的数据结构

基本操作

创建

  1. 常用方式:使用花括号;
#冒号左边为key,右边为value
student = {'name': '张三', 'age': 30}
  1. 使用内置函数dict()
#等号左边为key,右边为value
student = dict(name = '张三', age = 30)

取值

  1. 使用[]进行取值:如果字典中不存在指定的key,则输出keyError;
student = {'name': '张三', 'age': 30}
nm = student[name]	#返回结果为'张三'
sx = student[sex]	#输出keyError
  1. get()方法:如果字典中不存在指定的key,则返回None
student = {'name': '张三', 'age': 30}
nm = student.get('name')		#返回结果为'张三'
sx = student.get('sex')			#返回结果为None
sc = student.get('score', 100)	#返回结果为100,但该键值对不会新增到字典中

key的判断

  1. in:指定的key在字典中存在,返回True;
  2. not in:指定的key在字典中不存在,返回False。

增加元素

student = {'name': '张三', 'age': 30}
student['sex'] = '女'

删除元素

  1. 删除指定的键值对
student = {'name': '张三', 'age': 30}
del student['name']		#将key为name的键值对删除
  1. 清空字典的元素
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)