「@Author :Runsen」

字典和集合

字典是一系列无序元素的组合,其长度大小可变,元素可以任意地删减和改变。不过要注意,这里的元素,是一对键(key)和值(value)

相比于列表和元组,字典的性能更优,特别是对于查找、添加和删除,字典都能在常数的时间复杂度内完成

而集合和字典基本相同,唯一的区别,就是集合没有键和值的配对是一系列无序的、唯一的元素组合。

d1 = {'name': 'jason', 'age': 20, 'gender': 'male'}

d2 = dict({'name': 'jason', 'age': 20, 'gender': 'male'})

d3 = dict([('name', 'jason'), ('age', 20), ('gender', 'male')])

d4 = dict(name='jason', age=20, gender='male')

d1 == d2 == d3 ==d4

True

s1 = {1, 2, 3}

s2 = Set([1, 2, 3])

s1 == s2

True

集合并不支持索引操作,因为集合本质上是一个哈希表,和列表不一样

s = {1, 2, 3}

s[0]

Traceback (most recent call last):

File "", line 1, in

TypeError: 'set' object does not support indexing

想要判断一个元素在不在字典或集合内,我们可以用 value in dict/set

s = {1, 2, 3}

1 in s

True

10 in s

False

d = {'name': 'Runsen', 'age': 20}

'name' in d

True

'location' in d

False

「字典的增删改」

In [1]: d = {'name': 'Runsen', 'age': 20}^M

...:

In [2]: d['gender'] = 'male'

In [3]: d['birthday'] = '1999-10-01'

In [4]: d

Out[4]: {'name': 'Runsen', 'age': 20, 'gender': 'male', 'birthday': '1999-10-01'}

In [5]: d['birthday'] = '1999/10/01'

In [6]: d.pop('birthday')

Out[6]: '1999/10/01'

In [8]: d

Out[8]: {'name': 'Runsen', 'age': 20, 'gender': 'male'}

In [9]: s = {1, 2, 3}^M

...:

In [10]: s.add(4)

In [11]: s

Out[11]: {1, 2, 3, 4}

In [12]: s.remove(4)

In [13]: s

Out[13]: {1, 2, 3}****

「字典的升序和降序排序」

d = {'b': 1, 'a': 2, 'c': 10}

d_sorted_by_key = sorted(d.items(), key=lambda x: x[0]) # 根据字典键的升序排序

d_sorted_by_value = sorted(d.items(), key=lambda x: x[1]) # 根据字典值的升序排序

d_sorted_by_key

[('a', 2), ('b', 1), ('c', 10)]

d_sorted_by_value

[('b', 1), ('a', 2), ('c', 10)]

增删查找

字典和集合是进行过性能高度优化的数据结构,特别是对于查找、添加和删除操作

「列表的做法」

# list version

def find_unique_price_using_list(products):

unique_price_list = []

for _, price in products: # A

if price not in unique_price_list: #B

unique_price_list.append(price)

return len(unique_price_list)

# products id 和 price

products = [

(143121312, 100),

(432314553, 30),

(32421912367, 150),

(937153201, 30)

]

print('number of unique price is: {}'.format(find_unique_price_using_list(products)))

# 输出

number of unique price is: 3

「集合的做法」

# set version

def find_unique_price_using_set(products):

unique_price_set = set()

for _, price in products:

unique_price_set.add(price)

return len(unique_price_set)

products = [

(143121312, 100),

(432314553, 30),

(32421912367, 150),

(937153201, 30)

]

print('number of unique price is: {}'.format(find_unique_price_using_set(products)))

# 输出

number of unique price is: 3

比较运行的时间,也就是性能

import time

id = [x for x in range(0, 100000)]

price = [x for x in range(200000, 300000)]

products = list(zip(id, price))

# 计算列表版本的时间

start_using_list = time.perf_counter()

find_unique_price_using_list(products)

end_using_list = time.perf_counter()

print("time elapse using list: {}".format(end_using_list - start_using_list))

## 输出

time elapse using list: 41.61519479751587

# 计算集合版本的时间

start_using_set = time.perf_counter()

find_unique_price_using_set(products)

end_using_set = time.perf_counter()

print("time elapse using set: {}".format(end_using_set - start_using_set))

# 输出

time elapse using set: 0.008238077163696289

在性能上集合完爆列表

对于字典,哈希表存储了哈希值,键和值这桑三个元素

字典和集合都是无序的数据结构,其内部的哈希表存储结构,保证了查找,插入,删除操作的高效性。所以,字典和集合通常运用在对元素的查找,去重

初始化字典的方式有两种方法,比较下哪一种更高效,

In [20]: timeit a ={'name':"runsen",'age':20}

127 ns ± 0.8 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [21]: timeit b =dict({'name':"runsen",'age':20})

438 ns ± 3.41 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

第一种,因为不用调用相关的函数

字典的键可以是一个列表吗?下面这段代码中,字典的初始化是否正确

In [22]: d = {'name': 'Runsen', ['education']: [' primary school', 'junior middle school']}^M

...:

---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

in

----> 1 d = {'name': 'Runsen', ['education']: [' primary school', 'junior middle school']}

TypeError: unhashable type: 'list'

In [23]: d = {'name': 'Runsen', ('education'): [' primary school', 'junior middle school']}^M

...:

...:

In [24]: d

Out[24]: {'name': 'Runsen', 'education': [' primary school', 'junior middle school']}

用列表作为 Key 在这里是不被允许的,因为列表是一个动态变化的数据结构,字典当中的 key 要求是不可变的,原因也很好理解.

key 首先是不重复的,如果 Key 是可以变化的话,那么随着 Key 的变化,这里就有可能就会有重复的 Key,那么这就和字典的定义相违背;如果把这里的列表换成之前我们讲过的元组是可以的,因为元组不可变。❝ 本文已收录 GitHub,传送门~[1] ,里面更有大厂面试完整考点,欢迎 Star。

Reference

[1]

python字典合并去重_十三、深入Python字典和集合相关推荐

  1. python链表合并去重_合并两个链表并去重(php实现)

    这个也是某公司面试题,自己没做出来,原因有几点: 自己学的不扎实,眼高手低 面试官要我在白板上写出程序,必须得php写,思路不行,写的时候感觉白板有点小 写的过程中发现实现还是会需要一些步骤的,而且感 ...

  2. python dd 合并二进制文件_马克的Python学习笔记#数据编码与处理 5

    读写二进制结构的数组 一般情况下来说,我们可以使用struct模块,比如我们可以像这样将一列Python元组写入到一个二进制文件之中,通过struct模块将每个元组编码为一个结构. from 当然,如 ...

  3. 遍历字典_十三、Python字典三种遍历方法

    Python字典是最基本的数据结构之一,在Python中使用非常频繁,所以对Python字典的遍历非常重要.下面介绍常用的几种字典遍历方法. 根据key遍历 d1 = {'姓名': '风清扬', '年 ...

  4. python字典合并几种方式对比,Python合并两个字典的常用方法与效率比较

    本文实例讲述了Python合并两个字典的常用方法与效率比较.分享给大家供大家参考.具体分析如下: 下面的代码举例了5种合并两个字典的方法,并且做了个简单的性能测试 #!/usr/bin/python ...

  5. python dict 合并同类项_零基础入门学习Python,这13个Python惯用小技巧一定要收藏...

    原标题:零基础入门学习Python,这13个Python惯用小技巧一定要收藏 Python的小技巧很多,入门容易精通难!在进阶的路上,有没有什么好的技巧和好的方法,就是不断总结,不断记笔记!尤其是好的 ...

  6. python列表嵌套字典取值_我的 python 学习历程-Day05 字典/字典的嵌套

    一.字典的初识 为什么要有字典 字典与列表同属容器型数据类型,同样可以存储大量的数据,但是,列表的数据关联性不强,并且查询速度比较慢,只能按照顺序存储. 什么是字典 先说一下什么叫可变与不可变的数据类 ...

  7. python 字典性质描述_卧槽!Python还有这些特性(2):奇怪的字典

    (给Python开发者加星标,提升Python技能)英文:Satwik Kansal,翻译:暮晨 Python开发者整理自 GitHub [导读]:Python 是一个设计优美的解释型高级语言,它提供 ...

  8. python字典查找元素_详解Python字典小结

    字典(dict)结构是Python中常用的数据结构,笔者结合自己的实际使用经验,对字典方面的相关知识做个小结,希望能对读者一些启发~ 创建字典 常见的字典创建方法就是先建立一个空字典,然后逐一添加键( ...

  9. python字典遍历输出_详解Python字典的复制与遍历

    本篇介绍Python中字典的复制与遍历.文中会讨论字典的浅复制与深复制的区别,字典的遍历方法和方式.通过本篇的学习,可以了解字典浅复制与深复制的区别,掌握字典遍历的方法和方式. 1.字典的复制 Pyt ...

最新文章

  1. 《深入C++对象模型》笔记
  2. java spring mysql配置_java相关:mysql+spring+mybatis实现数据库读写分离的代码配置
  3. 哪个线程执行CompletableFuture的任务和回调?
  4. socket通信简介
  5. CodeForces 895 B. XK Segments 二分查找
  6. InceptionNet与mobileNet
  7. World Wind Java开发之二 使用Winbuilders设计图形用户界面(转)
  8. 计算机类中外合作办学情况,郑州大学2021年河南省本科一批各专业录取分数统计...
  9. 【干货】Python中几个有趣的函数
  10. 将控制台输出重定向到textbox的dotnet类
  11. EasyUI Tree添加节点
  12. Dubbo的架构体系
  13. linux关闭在线登录用户和禁止root/IP直接ssh登录linux
  14. Windows XP精简版无添加删除组件选项而无法安装IIS的解决之道
  15. HttpWatch工具简介及使用技巧(转)
  16. LDUOnlineJudge特判程序 special judge (SPJ) 编写方法;HUSTOJ特判题目设置方法
  17. 一个读取3DS文件的类CLoad3DS浅析Ⅰ
  18. 看了一遍蝴蝶效应1,在看到了一篇很好的《蝴蝶效应1》影评
  19. 面向对象案例——贪吃蛇游戏
  20. Github 上火热的十个 Python 项目,从Debug工具到AI水军、量化交易系统。( 嗨学编程)

热门文章

  1. vue微信H5(微信公众号)实现微信支付功能
  2. Raptor-博客进展(持续记录)
  3. linux git pull 失败,解决git pull到github不成功的问题
  4. 百家饭OpenAPI v0.6.0新版夏日发布!快来看(3)——多端API整合测试功能
  5. 年底了,你敢炒老板鱿鱼吗?
  6. 华为海思2022数字芯片笔试题(节选)
  7. lol祖安服务器维护,LOL小学生最聚集10大服务器:艾欧尼亚倒数第一
  8. 数学建模2 多属性决策模型
  9. 卧龙图说白酒:你认识白酒吗?值得一看的白酒知识
  10. yum换源/QQ安装