python 字典和集合

Python中字典和集合 Python字典可存储任意类型对象,如字符串、数字、元组…… 优点:取值方便,速度快 由不同元素组成的集合,集合是一组无序排列 可hash值,可作为字典的key的值才能作为集合的值。 阅读详情

字典和集合在 Python 被广泛使用,并且性能进行了高度优化。

基础

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

相对于列表和元组,字典的性能更优,主要是体现在查找、添加和删除;

和list比较,dict有以下几个特点:

查找和插入的速度极快,不会随着key的增加而变慢;

需要占用大量的内存,内存浪费多。

而list相反:

查找和插入的时间随着元素的增加而增加;

占用空间小,浪费内存很少。

字典和集合基本相同,区别在于集合没有键和值的配对,是一些列无序的、唯一的元素集合

字典基础操作

创建:

d1 = {'name': 'tom', 'age': 18, 'gender': 'male'}

d2 = dict({'name': 'tom', 'age': 18, 'gender': 'male'})

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

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

print(d1,d2,d3,d4)

print(d1['name'])  #查找

d1['age'] = 20    #修改

del d1['name']    #删除

d1.pop("age")   

# 合并

dic1 = {"name": "tom"}

dic2 = {"age": "18"}

dic1.update(dic2)

d1.setdefault("name") # 如果有这个值则输出,若没有则创建并使用默认值none

d1.get("name")        # 如果有这个值则输出,若没有返回默认值none

# 创建一个新的字典,默认值是`123`

a = dic.fromkeys(["k1", "k2", "k3"], "123")

print(a)

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]) # 根据字典值的升序排序

集合基础操作

集合创建:

s1 = {1, 2, 3}

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

print(s1 == s2, s1, s2)

# True {1, 2, 3} {1, 2, 3}

n = {"alex",'eric','tony'}

n.add("bill")    # 添加

n.clear()        #清空

n.copy()        #复制

# 输出s1中存在,s2中不存在

s1 = {"alex",'eric','tony','李四','李四11'}

s2 = {"alex",'eric','tony','张三'}

v = s1.difference(s2)

print(v)  # 输出s1中存在,s2中不存在

# {'李四', '李四11'}

v = s1.symmetric_difference(s2) # 输出两集合不同的元素

s1.symmetric_difference_update(s2)  # 输出两个几个不同的元素并清空s1,并将不同的元素复制到s1

v = s1.intersection(s2)        # 两个集合相同的元素(交集)

s1.intersection_update(s2)      # 取交集,然后对s1清空,然后在重新复制

v = s1.union(s2)                # 并集

s1.discard('alex')              # 移除

v = s1.issubset(s2)            # 判断s1 是否是 s2的子集

v = s1.issuperset(s2)          # s1 是否是 s2的父集

v = s1.pop()                    # 随机删除一个元素,并取值

s1.remove('alex')              # 移除

s1.update({'alex','123123','fff'}) # 批量添加,有相同的部分不改

s = {3, 4, 2, 1}

sorted(s) # 对集合的元素进行升序排序

[1, 2, 3, 4]

set运算

a = {1,2,3,4,5}

b = {2,3,4,5,6}

print(a.union(b))      #并集

print(a-b)              #差集

print(a&b)              #求交集

print(a^b)              #对称差集

print(a.issubset(b))    #a是b的子集 看返回值的真假

print(a.issuperset(b))  #a是否包含b 看返回值的真假

字典和集合的性能

列表中查找

def find_product_price(products, product_id):

    for id, price in products:

        if id == product_id:

            return price

    return None

 

products = [

    (143121312, 100),

    (432314553, 30),

    (32421912367, 150)

]

print('The price of product 432314553 is {}'.format(find_product_price(products, 432314553)))

# 输出

The price of product 432314553 is 30

字典中查找

def find_product_price(products, product_id):

    for id, price in products:

        if id == product_id:

            return price

    return None

 

products = [

    (143121312, 100),

    (432314553, 30),

    (32421912367, 150)

]

print('The price of product 432314553 is {}'.format(find_product_price(products, 432314553)))

# 输出

The price of product 432314553 is 30

上面结果可以看出 字典在查找方面更优,列表查找时间复杂度为:O(n),即使使用二分查找,也需要O(logn)的时间复杂度。字典的时间复杂度为O(1).

列表和集合去重性能对比

import time

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

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

products = list(zip(id, price))

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)

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)

# 计算列表版本的时间

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: 54.833863215

# 计算集合版本的时间

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.009784918000001142

可以看出,仅数十万的数据,两者的差距如此之大。

字典和集合的工作原理

上面可以看出,字典和集合性能在查找、插入、和删除的性能很高效

原因在于,字典和集合的内部结构是一张哈希表。

对于字典而言,这张表存储了哈希值(hash)、键、和值,三个元素

对集合来说,哈希表内没有键和值的配对,只有单一的元素

新版本python hash涉及结构发生了改变,大幅提高了空间利用率

插入操作

每次向字典或集合插入一个元素时,Python 会首先计算键的哈希值(hash(key)),再和 mask = PyDicMinSize - 1 做与操作,计算这个元素应该插入哈希表的位置 index = hash(key) & mask。如果哈希表中此位置是空的,那么这个元素就会被插入其中。

而如果此位置已被占用,Python 便会比较两个元素的哈希值和键是否相等。

若两者都相等,则表明这个元素已经存在,如果值不同,则更新值。

若两者中有一个不相等,这种情况我们通常称为哈希冲突(hash collision),意思是两个元素的键不相等,但是哈希值相等。这种情况下,Python 便会继续寻找表中空余的位置,直到找到位置为止。

值得一提的是,通常来说,遇到这种情况,最简单的方式是线性寻找,即从这个位置开始,挨个往后寻找空位。当然,Python 内部对此进行了优化(这一点无需深入了解,你有兴趣可以查看源码,我就不再赘述),让这个步骤更加高效。

查找操作

和前面的插入操作类似,Python 会根据哈希值,找到其应该处于的位置;然后,比较哈希表这个位置中元素的哈希值和键,与需要查找的元素是否相等。如果相等,则直接返回;如果不等,则继续查找,直到找到空位或者抛出异常为止。

删除操作

对于删除操作,Python 会暂时对这个位置的元素,赋于一个特殊的值,等到重新调整哈希表的大小时,再将其删除。

不难理解,哈希冲突的发生,往往会降低字典和集合操作的速度。因此,为了保证其高效性,字典和集合内的哈希表,通常会保证其至少留有 1/3 的剩余空间。随着元素的不停插入,当剩余空间小于 1/3 时,Python 会重新获取更大的内存空间,扩充哈希表。不过,这种情况下,表内所有的元素位置都会被重新排放。

虽然哈希冲突和哈希表大小的调整,都会导致速度减缓,但是这种情况发生的次数极少。所以,平均情况下,这仍能保证插入、查找和删除的时间复杂度为 O(1)。

全面分析总结解决Could not transfer artifact org.apache.maven.plugins等此类问题的方法 全面分析总结解决Could not transfer artifact org.apache.maven.plugins,Could not transfer artifact xxx from/to xxx等此类问题的方法 阅读详情

相关推荐

Codex CLI 接入智谱 GLM-5.1 完整教程

Codex CLI 是 OpenAI 推出的命令行 AI 编程工具,支持自主读取文件、执行命令、编写代码等操作,是目前最火的终端 AI 编程工具之一。通过 CLIProxyAPI 代理,我们成功将 Codex CLI 与智谱 GLM-5.1 模型对接,核心在于解决 Responses API 与 Chat Completions API 的协议转换问题。✅成熟稳定:CLIProxyAPI 社区活跃(4.7k fork),持续维护✅完整兼容:支持流式/非流式、function calling✅低成本。

u011831527的博客 2574

C# 性能优化 List&LinkedList&Dictionary

抛开Dictionary代码内部具体实现,从哈希的原理上来看,哈希表虽然需要数组来进行存储,但本身是基于散列来存储的,插入不必说,删除是借助“链表”来实现高效的:哈希表必然要解决的一个问题是哈希冲突,在C#中是采用“拉链法”来解决这个问题的,但在此并非采用真正的链表(如果是的话,最坏情况下插入、查询会退化成ListNode),在Dictionary内部采用Entry结构体存储数据,并且该结构体中存有下一个节点的索引位置,因此删除操作只需要修改删除该节点并将其前驱节点的next指向其后继结点。

少年的博客 2276

RS422总线

①.RS422发送驱动器无高阻三态(浮空)状态RS422收发芯片,发送脚固定强驱动输出,永远钳位 A/B 差分电平,不能关断、不能悬空,只要芯片上电,TX+、TX - 就强制输出互补电压(一路高、一路低)。多条发送并联在同一组差分线上:两个驱动器一个拉 A 高、一个拉 A 低,B 线反向拉扯 → 电源→地大电流对灌,瞬间芯片过流发烫烧毁、总线电平短路错乱。注意:RS485 带DE/RE 收发使能脚:不用发送时可关闭驱动器,输出变成高阻浮空,让出总线,因此能多节点分时发送。③.多点通信方式,一主多从方式;

zhuimeng_1234的博客 223

List<T> 与 Dictionary<K,T> 的查询效率区别

Console.WriteLine($"resultDic:{watchH.ElapsedMilliseconds}总时长");Console.WriteLine($"result:{watchH.ElapsedMilliseconds}总时长");都知道Dictionary 时间复杂度效率是0(1) List 0(n)闲来无聊写个代码测试下对比下。

298

MSP430开发入门:手把手教你用IAR EW430从建工程到烧录调试(附F5529配置)

本文详细介绍了如何使用IAR Embedded Workbench(EW430)进行MSP430F5529开发板的嵌入式开发,从环境搭建、工程配置到硬件调试全流程。通过实战示例和关键配置技巧,帮助开发者快速掌握MSP430开发的核心要点,包括LED控制、定时器使用和低功耗优化等实用技术。

weixin_30240349的博客 392

【高级强化学习:算法、优化与泛化】第13章 扩散模型策略优化(Diffusion Policy Optimization)

\quad$ 计算均值 $\mu_t = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \tilde{\epsilon} \right)$.$\quad$ 组合得分估计: $\tilde{\epsilon} = \epsilon_{\text{unc}} + w \cdot (\epsilon_{\text{con}} - \epsilon_{\text{unc}})$.

u012133341的博客 338

Python-字典与集合

字典通常用于描述一个对象的属性,如果一个物品的信息,如:颜色、大小、形状等。

掩月天权的博客 1564

Redhawk: dynamic ir drop分析(Clock Buffer Clustering)

在dynamic分析中,ir drop问题多出现在三种情况下,缺power mesh,缺power switch,clock cell过于密集。 前两种情况通过选中具体instance查看min res path都比较容易分析出来,而且大部分问题都出现在channel里,这里不多做赘述。 clock cell过于密集这是观察结果,缺少报告支持,这里分享一下分析方法。 首先,选中压降超过signoff标准的instance,(Results->List of Worst Instance DVD中

m0_61544122的博客 5274

python基础篇-字典和集合

python的字典和集合

清微的博客 1125

【零基础入门unity游戏开发——unity3D篇】unity CharacterController 3D角色控制器最详细的使用介绍,并实现俯视角、第三人称角色控制(附项目源码)

【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用但是我发现很多人还是不理解,都跑来私信问我,所以决定重新做一个更加详细且简单控制器,主要是实现俯视角和第三人称角色控制。添加一个胶囊体,添加Character Controller组件,记得删除Capsule Collider组件,因为Character Controller自带了碰撞,所以不需要Character Controller参数介绍。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 5022

LangChain与LangGraph核心区别解析

LangChain与LangGraph是当前大语言模型(LLM)应用开发中两个紧密相关且极具影响力的开源框架。它们源于LangChain AI公司,设计哲学互补,旨在解决不同维度的LLM工程化问题,共同构成了构建复杂智能应用的强大工具集。

weixin_35774598的博客 1923

Python: 字典与集合

1.1字典的使用 字典中每一个成员以“键:值”对的形式成对存在的。字典是以大括号“{}”包围并且以“键:值”对的方式声明和存在的数据集合。字典与列表比较最大的不同是字典是无序的,其成员的位置是象征性的,在字典中通过键来访问成员,而不能通过其他的方式来访问该成员。 1.1.1创建并使用字典 在Python程序中,字典可以储存任意类型的对象。字典的每一对键值对“key:value”之间必须用冒号“:”分隔,每一对之间用“,”分隔,整个字典在“{}”中。所有的 key 都是唯...

小孙的博客 2258

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

python的集合和字典

python 的集合和字典

一个想交朋友的陌生人 1605

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Python之字典和集合

Python之字典与集合

sys19897976523的博客 903

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

7.Python中的集合、字典、集合和字典的应用整理总结

总结: 1.集合和集合的运算 2.字典和字典的运算及函数 3.集合和字典的应用 一、集合 集合是一类容器,元素没有先后顺序,并且元素的值不重复。 集合的字面量用花括号{} {1,5,7} {‘apple’,‘orange’,‘pear’,‘banana’} 创建集合: 直接给变量赋值一个集合字面量 fruit = {‘apple’,‘orange’,‘pear’,‘banana’} 使用 set()创建一个空集合 emp = set() 注:emp={} #创建一个空字典 使用set()将列表或者.

weixin_45994391的博客 1248

Python中的字典和集合

1. 字典(dict) 字典(dict,全称: dictionary )是python内置的一种使用“键值对结构”存储数据的存储模型。在其它语言中也称为map或者是object(对象) 1.1 字典的操作 创建/查询/修改字典 # 创建字典:变量名 = {键1:值1,键2:值2,……} d = {'kendny': 99, 'Mary': 88} # 添加数据:变量名[键] = 值 (字典中没...

凤凰人 6123

Python基础—序列、字典和集合

随着人工智能的不断发展,python这门技术也越来越重要,很多人都开启了学习python,本文就介绍了python的基础内容。以上就是今天要讲的内容,本文仅仅简单介绍了序列、字典和集合。

weixin_52196308的博客 783

Python的字典和集合

定义集合时需要注意,如果是空集合(不包含任何元素的集合),必须使用set()函数定义,如果包含元素,则可以使用“{}”定义集合,也可以使用set()函数加上列表来定义。,每个元素都是由冒号“:”和键值对(“:” 左边的称为键或者Key,“:”右边的称为值或者Value)构成的,用“{}”标识,元素之间用逗号“‘,”分隔。字典的键必须是唯一且不重复的,可以直接使用“{}”表示空字典。【在使用字典时,很少直接输出它的内容,一般需要根据指定的键得到相应的值,在Python中,访问字典元素可以通过指定的键来实现】

2401_86008949的博客 873

python中字典和集合的区别_Python中字典和集合的详细介绍

本文通过实例给大家介绍了python中字典和集合的知识小结,非常不错,具有参考借鉴价值,需要的的朋友参考下吧映射类型:表示一个任意对象的集合,且可以通过另一个几乎是任意键值的集合进行索引与序列不同,映射是无序的,通过键进行索引任何不可变对象都可用作字典的键,如字符串、数字、元组等包含可变对象的列表、字典和元组不能用作键引用不存在的键会引发KeyError异常1)字典dict { } 空字典{ ...

weixin_39610678的博客 2062

python中的集合和字典

集合()和字典()是 Python 中两种常用的内建数据结构,它们都基于哈希表(hash table)实现,具有一些相似的特性,但也有显著的不同。下面是它们的详细比较:集合(): python复制代码字典(): python复制代码集合():示例: python复制代码字典():示例: python复制代码集合(): python复制代码字典(): python复制代码集合(): python复制代码字典(): python复制代码

weixin_46532327的博客 1861

python字典和集合对象可以进行索引_python集合和字典

Python也包含有 集合 类型。集合是由不重复元素组成的无序的集。它的基本用法包括成员检测和消除重复元素。python集合对象也支持像 联合,交集,差集,对称差分等数学运算。花括号或 set() 函数可以用来创建集合。注意:要创建一个空集合你只能用 set() 而不能用 {},因为后者是创建一个空字典,这种数据结构我们会在python教程下一节进行讨论。以下是一些简单的示例:>>> print(...

weixin_39965283的博客 855

python中字典和集合对象是无序的_python字典和集合

1. 字典字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。可哈希表示key必须是不可变类型,如:数字、字符串、只含不可变类型元素的元组(1,2,3,’abc’)、实现__hash__()方法的自定义对象(因为__hash__()须返回一个整...

weixin_33841242的博客 2657

Python中字典和集合的区别与联系

字典(dict)和集合(set)在 Python 被广泛使用,并且性能进行了高度优化,其重要性不言而喻。 字典和集合基础 字典是一系列由键(key)和值(value)配对组成的元素的集合。python3.7之后,字典底层是2个数组,一个为一维数组,存放hash(key)取余后的值作为数组的索引,对应索引位置存放键值对在二维数组的索引位置。因此二维数组是一个有序的数组。 相比于列表和元组,字典的性能更优,特别是对于查找、添加和删除操作,字典都能在常数时间复杂度内完成。 而集合和字典基本相同,唯一的区别,就是集

scu-liu的博客 1万+

【Python】字典集合和序列

目录字典1. 可变类型与不可变类型2. 字典的定义3. 创建和访问字典4. 字典的内置方法 字典 1. 可变类型与不可变类型 序列是以连续的整数为索引,与此不同的是,字典以"关键字"为索引,关键字可以是任意不可变类型,通常用字符串或数值。 字典是 Python 唯一的一个 映射类型,字符串、元组、列表属于序列类型。 那么如何快速判断一个数据类型 X 是不是可变类型的呢?两种方法: 麻烦方法:用 id(X) 函数,对 X 进行某种操作,比较操作前后的 id,如果不一样,则 X 不可变,如果一样,则

CharlieTang的博客 916

python中集合和字典的区别_Python中字典和集合学习小结

映射类型:表示一个任意对象的集合,且可以通过另一个几乎是任意键值的集合进行索引与序列不同,映射是无序的,通过键进行索引任何不可变对象都可用作字典的键,如字符串、数字、元组等包含可变对象的列表、字典和元组不能用作键引用不存在的键会引发KeyError异常1)字典dict { } 空字典{ key1:value1,key2:value2,... }字典在其它编程语言中又称作关联数组或散列表;通过键...

weixin_39737001的博客 451
上一篇: Java名企面试题大汇总:最近5年133个Java面试问题列表
下一篇: 程序人生:“自学Python,如何拿下了月薪15k的工作
程序员林子
博客等级 码龄7年 369粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值