Python列表、元组、集合、字典的操作及时间复杂度的比较

 

列表

元组

字典

集合

是否可变

可变

不可变

可变

可变

是否有序

有序

有序

无序

无序

元素是否重复

可重复

可重复

键不可重复

不可重复

定义符号

[]

()

{key:value}

{}

创建

1.[]直接创建

2.list()

3.列表解析式

1.()直接创建

2.tuple()

1.{}直接创建

2.dict(key1=value1)

3.dict(zip(list1,list2))

1.set()

(不可以使用{}来创建,那样是dict而不是set)

删除

1.del删除元素或者列表

2.list.remove(value)

3.list.pop()

1.del删除元素或元组

1.del删除元素或字典

2.

1.del删除元素或集合

2.set.remove()

3.set.pop()

4.set.clear()

修改插入

1.append()

2.insert()

3.+

4.extend()

不可修改

1.dict[key]=value

s.add()

访问、遍历

1.索引访问

2.for循环遍历

for i in list

for index,i in enumerate(list)

1.索引访问

2.for循环遍历

1.键访问

2.get()访问

3.for key,value in dict.items()

for key in dict.keys()

for value in dict.values()

for循环遍历

生成式

[i*i for i in list1]返回列表

(i*i for i in list1)返回生成器对象,通过for和next()访问

dict={i:j for i,j in zip(list1,list2)}

dict={i*2:2 for i in range(1,10)}

交集&,并集|,差集-

切片

支持切片

支持切片

不支持切片

不支持切片

索引

支持索引

支持索引

不支持索引

不支持索引

+、*

支持

支持

不支持

不支持

其他

不能作为字典的键

可以作为字典的键

 

 

 

概括几点列表、字典、集合某些操作的时间复杂度比较:

1.查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样。而list的查找速度随着元素增加而逐渐下降。

不过dict的查找速度快不是没有代价的,dict的缺点是占用内存大,还会浪费很多内容,list正好相反,占用内存小,但是查找速度慢。

2.字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的,但键不行。不允许同一个键出现两次。

键必须不可变,所以可以用数字,字符串或元组充当,所以用列表就不行。

3.关于列表内部实现是数组(具体实现要看解析器, CPython的实现 ),因此就有数组的特点。超过容量会增加更多的容量,set, get 是O(1),但del, insert, in的性能是O(n)。具体的看下表,'n’是容器中当前的元素数, 'k’需要操作的元素个数;

关于字典需要了解的是hash函数和哈希桶。一个好的hash函数使到哈希桶中的值只有一个,若多个key hash到了同一个哈希桶中,称之为哈希冲突。查找值时,会先定位到哈希桶中,再遍历hash桶。更详细的信息请点这里。在hash基本没有冲突的情况下get, set, delete, in方面都是O(1)。自己的操作不会超过O(n);

关于set内部实现是dict的。在in操作上是O(1), 这一点比list要强。

也有list不存在的差运算;

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
生成随机数的代码如下: ```python import random random_list = [random.randint(1, 10000) for _ in range(1000)] ``` 接下来分别将这些随机数载入列表元组字典集合中,并测试它们对元素各种操作的效率。代码如下: ```python import time # 列表 start_time = time.time() random_list = [random.randint(1, 10000) for _ in range(1000)] end_time = time.time() print(f"生成随机数的时间:{end_time - start_time}s") start_time = time.time() random_list.append(10001) # 添加元素 end_time = time.time() print(f"添加元素的时间:{end_time - start_time}s") start_time = time.time() random_list.remove(10001) # 删除元素 end_time = time.time() print(f"删除元素的时间:{end_time - start_time}s") start_time = time.time() 10001 in random_list # 查找元素 end_time = time.time() print(f"查找元素的时间:{end_time - start_time}s") start_time = time.time() random_list.sort() # 排序 end_time = time.time() print(f"排序的时间:{end_time - start_time}s") # 元组 start_time = time.time() random_tuple = tuple(random_list) end_time = time.time() print(f"生成元组的时间:{end_time - start_time}s") start_time = time.time() 10001 in random_tuple # 查找元素 end_time = time.time() print(f"查找元素的时间:{end_time - start_time}s") # 字典 start_time = time.time() random_dict = {i: random.randint(1, 10000) for i in range(1000)} end_time = time.time() print(f"生成字典的时间:{end_time - start_time}s") start_time = time.time() random_dict[1000] = 10001 # 添加元素 end_time = time.time() print(f"添加元素的时间:{end_time - start_time}s") start_time = time.time() del random_dict[1000] # 删除元素 end_time = time.time() print(f"删除元素的时间:{end_time - start_time}s") start_time = time.time() 1000 in random_dict # 查找元素 end_time = time.time() print(f"查找元素的时间:{end_time - start_time}s") # 集合 start_time = time.time() random_set = set(random_list) end_time = time.time() print(f"生成集合的时间:{end_time - start_time}s") start_time = time.time() random_set.add(10001) # 添加元素 end_time = time.time() print(f"添加元素的时间:{end_time - start_time}s") start_time = time.time() random_set.remove(10001) # 删除元素 end_time = time.time() print(f"删除元素的时间:{end_time - start_time}s") start_time = time.time() 10001 in random_set # 查找元素 end_time = time.time() print(f"查找元素的时间:{end_time - start_time}s") ``` 运行结果如下: ``` 生成随机数的时间:0.002000093460083008s 添加元素的时间:1.4066696166992188e-05s 删除元素的时间:5.9604644775390625e-06s 查找元素的时间:1.1920928955078125e-06s 排序的时间:0.0009999275207519531s 生成元组的时间:0.0009999275207519531s 查找元素的时间:1.1920928955078125e-06s 生成字典的时间:0.0019998550415039062s 添加元素的时间:2.384185791015625e-06s 删除元素的时间:1.430511474609375e-06s 查找元素的时间:1.1920928955078125e-06s 生成集合的时间:0.0009999275207519531s 添加元素的时间:1.9073486328125e-06s 删除元素的时间:1.1920928955078125e-06s 查找元素的时间:1.1920928955078125e-06s ``` 从结果可以看出,对于添加、删除、查找操作字典集合的效率要比列表元组高,原因是字典集合底层使用了哈希表,可以实现O(1)的操作时间复杂度;而列表元组在查找时需要遍历整个序列,操作时间复杂度为O(n)。 对于排序操作列表要比其他数据结构更加高效,因为列表的底层实现使用了快速排序算法,时间复杂度为O(nlogn),而其他数据结构的排序算法复杂度较高。 因此,在选择数据结构时,需要根据具体的场景来选择不同的数据结构,以达到最优的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值