查找场景下与列表的性能对比

  字典与集合之所以高效的原因是:内部结构都是一张哈希表。

  平均情况下插入、查找和删除的时间复杂度为 O(1).

  假设有数量100,000的产品列表:

  1. import time
  2. id = [x for x in range(, )]
  3. price = [x for x in range(, )]
  4. products = list(zip(id, price))
  5. #products
  6. # [(, ), (, )....(, )]

  要统计出总共有多少种不同的价格,分别用列表list与集合set来作为存储的数据结构,来对比下性能。

  用列表作为数据结构:

  1. # # 计算列表版本的时间
  2.  
  3. # list version
  4. def find_unique_price_using_list(products):
  5. unique_price_list = []
  6. for _, price in products: # A
  7. if price not in unique_price_list: #B
  8. unique_price_list.append(price)
  9. return len(unique_price_list)
  10.  
  11. start_using_list = time.perf_counter()
  12. find_unique_price_using_list(products)
  13. end_using_list = time.perf_counter()
  14. print("time elapse using list: {}".format(end_using_list - start_using_list))
    #time elapse using list: 53.206719899999996

  用集合作为数据结构:

  1. # # 计算集合版本的时间
  2. # set version
  3. def find_unique_price_using_set(products):
  4. unique_price_set = set()
  5. for _, price in products:
  6. unique_price_set.add(price)
  7. return len(unique_price_set)
  8.  
  9. start_using_set = time.perf_counter()
  10. find_unique_price_using_set(products)
  11. end_using_set = time.perf_counter()
  12. print("time elapse using set: {}".format(end_using_set - start_using_set))
    #time elapse using set: 0.009022799999996778

  从结果可以看出,性能差异非常大,使用合适的数据结构非常重要。

Dict与Set基础

  1. 集合不支持索引操作
  2. 判断元素是否在dict/set中用 in 操作符
  1. dict1 = {'a':1,'b':2}
  2. print('a' in dict1) #True
  3. print(1 in dict1) #False
  4. set1 = {'a','b','c'}
  5. print(1 in set1) #False
  6. print('b' in set1) #True

  3.集合的pop()方法是随机返回一个元素,并把集合中的该元素删除

  4.集合与字典的排序

  1. #字典排序
  2. d = {'b': 1, 'a': 2, 'c': 10}
  3. d_sorted_by_key = sorted(d.items(), key=lambda x: x[0]) # 根据字典键的升序排序
  4. d_sorted_by_value = sorted(d.items(), key=lambda x: x[1]) # 根据字典值的升序排序
  5. d_sorted_by_key
  6. [('a', 2), ('b', 1), ('c', 10)]
  7. d_sorted_by_value
  8. [('b', 1), ('a', 2), ('c', 10)]
  9.  
  10. #集合排序
  11. s = {3, 4, 2, 1}
  12. sorted(s) # 对集合的元素进行升序排序
  13. [1, 2, 3, 4]

 参考资料:

 极客时间《Python核心技术与实战》专栏

Python基础:字典(dict)与集合(set)的更多相关文章

  1. python基础——字典dict

    1.概念: (1)字典dict,是一系列的键—值对.每个键key都和一个值value相映射.(字典是python中唯一的映射类型.) (2)每一项item,是一个键值对key—value对. (3)键 ...

  2. python基础——字典(dict)

    字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 . dict1 = {} ...

  3. python基础-字典dict

    字典-dict 用途: 定义方法:通过{} 来存储数据,通过key:value (键值对)来存储数据,每个键值对通过逗号分隔.在键值对中,key 是不可变的数据类型,value 是任意数据类型 def ...

  4. python基础之字典dict和集合set

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7043642.html python基础之字典dict和集合set 字典dic ...

  5. python中几个常见的黑盒子之“字典dict” 与 “集合set”

    这里说到"字典dict" 和 "集合set"类型,首先,先了解一下,对于python来说,标准散列机制是有hash函数提供的,对于调用一个__hash__方法: ...

  6. python基础之dict、set及字符

    python基础之dict.set及字符串处理 本节内容 字典介绍及内置方法 集合介绍 字符串处理 1.字典介绍及内置方法 字典是python中唯一的映射类型,采用键值对(key-value)的形式存 ...

  7. python基础——使用dict和set

    python基础——使用dict和set dict Python内置了字典:dict的支持,dict全称dictionary,在其它语言中也称为map(映射),使用键-值(key-value)存储,具 ...

  8. 第四篇:python基础之dict、set及字符

    python基础之dict.set及字符   python基础之dict.set及字符串处理 本节内容 字典介绍及内置方法 集合介绍 字符串处理 1.字典介绍及内置方法 字典是python中唯一的映射 ...

  9. python基础—字典

    阅读文本需要3分钟,不建议跳读 节目清单 字典是python中最重要的数据类型,字典由“键-值”对组成的集合,字典中的“值”通过“键”来引用.这里将介绍字典的定义.访问.排序等功能. 字典的创建 字典 ...

随机推荐

  1. java关于方法参数传递的相关问题讨论

    我们知道,java中定义变量的目的有两个: 1.防止被垃圾回收机制回收,毕竟如果没有明确指向真实物理内存的'代号'很大可能会被java垃圾回收机制当作垃圾回收. 2.便于引用,方便处理. packag ...

  2. VMware每次联网都需要还原默认设置解决办法

    参考:https://zhidao.baidu.com/question/553464573715382812.html

  3. ActiveMQ与RocketMQ对比

      ActiveMQ RabbitMQ RocketMq ZeroMQ 关注度   高 高 中 中 成熟度   成熟 成熟 比较成熟 不成熟 所属社区/公司 Apache  MozillaPublic ...

  4. nodejs下express+ejs环境搭建

    nodejs下express+ejs环境搭建   分类: Nodejs 1.进入需要创建项目的目录    cd F:\nodeCode     2.创建一个带ejs模板工程,工程名为haha    e ...

  5. Scrapy框架的基本组成及功能使用

    1.什么是scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架.框架的本质就是集成各种功能.具有很强通用性的项目模板. 2.安装 Linux:       pip3 in ...

  6. CF739B

    深搜的过程中保存路径,二分路径中满足要求的区段.不必将每个节点的ans加1,只需将合法区段末尾加1同时将开头减1来表示并保存在一个“前缀”数组中即可.最后再dfs一次累加得到答案. #include ...

  7. sqlserver中drop、truncate和delete语句的用法

    虽然小编不建议大家去用命令删除数据库表中的东西,但是这些删除命令总有用的着的地方. 说到删除表数据的关键字,大家记得最多的可能就是delete了 然而我们做数据库开发,读取数据库数据.对另外的两兄弟用 ...

  8. 查询sqlserver数据库,表占用数据大小

     if exists(select 1 from tempdb..sysobjects where id=object_id('tempdb..#tabName') and xtype='u')dro ...

  9. OpenGL 渲染上下文-context

    context理解 OpenGL在渲染的时候需要一个Context,这个Context记录了OpenGL渲染需要的所有信息,可以把它理解成一个大的结构体,它里面记录了当前绘制使用的颜色.是否有光照计算 ...

  10. 网络大牛如何回答Chrome的15个刁钻面试题?

    (内容来自网络整理) Google的面试题在刁钻古怪方面相当出名,甚至已经有些被神化的味道.这里整理出15道Google面试题并一一给出了网络大牛的答案,其中不少都是流传很广的. 第1题:让你清洗西雅 ...