iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python基础之dict和set的使用详解
  • 709
分享到

Python基础之dict和set的使用详解

2024-04-02 19:04:59 709人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录dictset再议不可变对象小结dict python内置了字典:dict的支持,dict全称dictionary,在其他语言种也称为map,使用键-值(key-value)存储

dict

python内置了字典:dict的支持,dict全称dictionary,在其他语言种也称为map,使用键-值(key-value)存储,具有极快的查找速度。

举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list:

name = ['Micael','Bob','Tracy']
scores = [95.75,85]

给定一个名字,要查找对应的成绩,就先要在names种找到对应的位置,在从scores取出对应的成绩,list越长,耗时越长。

如果用dist实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找树的都不会变慢,用Python写一个dict如下:

>>> d = {'Michael':95,'Bob':75,'Tracy':85}
>>> d['Michael']
95

为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查摸一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list种查找元素的方法,list越大,查找越慢。

第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻大该页,找到这个字,无论找那个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。

dict就是第二种实现方式,给定一个名字,比如Michael,dict在内部就可以直接计算出Michael对应的存放成绩的“页码”,也就是95这个数字存放的内存地址,直接取出来,所以速度非常快。

你可以猜到,这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样取的时候才能根据key直接拿到value。

把数据放入dict的方法,处理初始化是指定外,还可以通过key放入:

>>> d['Adam'] = 67
>>> d['Adam']
67

由于一个key只能对应一个value,所以多次对一个key放入value,后面的值会把前面的值冲掉:

>>> d['Jack'] = 90
>>> d['Jack']
90
>>> d['Jack'] = 88
>>> d['Jacl']
88

如果key不存在,dict就会报错:

>>> d['Thomas']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Thomas'

要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:

>>> 'Thomas' in d
False

二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:

>>> d.get('Thomas')
>>> d.get('Thomas',-1)
-1

注意:返回None的时候Python的交互环境不显示结果。
要删除一个key,用pop(key)方法,对应的value也会从dict中删除:

>>> d.pop('Bob')
75
>>> d
{'Michael':95,'Tracy':85}

请务必注意,dict内不存放的顺序和key放入的顺序是没有关系的。

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

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

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

而list相反:

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

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

所以dict是用空间来换取时间的一种方法。

dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,要牢记第一条就是dict的key必须是不可变对象。

这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了,这个通过key计算位置的算法称为哈希算法(Hash)。

要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:

>>> key = [1,2,3]
>>> d[key] = 'a list'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

set

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以在set中,没有重复的key.

要创建一个set,需要提供一个list作为输入集合:

>>> s = set([1,2,3])
>>> s
[1,2,3]

注意,传入的参数[1,2,3]是一个list,而显示的{1,2,3}只是告诉你这个set内部有1,2,3这个3个元素,显示顺序也不表示set是有序的。

重复元素在set中自动被过滤:

>>> s = set([1,1,2,2,3,3])
>>> s
[1,2,3]

通过add(key)方法可以添加元素到set中,可以重复添加,但是不会有效果:

>>> s.add(4)
>>> s
{1,2,3,4}
>>> s.add(4)
>>> s
{1,2,3,4}

通过remove(key)方法可以删除元素:

>>> s.remove(4)
>>> s
{1, 2, 3}

set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}

et和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。

再议不可变对象

上面我们讲了,str是不变对象,而list是可变对象。

对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如:

>>> a = ['c', 'b', 'a']
>>> a.sort()
>>> a
['a', 'b', 'c']

而对于不可变对象,比如str,对str进行操作呢:

>>> a = 'abc'
>>> a.replace('a', 'A')
'Abc'
>>> a
'abc'

虽然字符串有个replace()方法,也确实变出了'Abc',但变量a最后仍是'abc',应该怎么理解呢?

我们先把代码改成下面这样:

>>> a = 'abc'
>>> b = a.replace('a', 'A')
>>> b
'Abc'
>>> a
'abc'

要始终牢记的是,a是变量,而'abc'才是字符串对象!有些时候,我们经常说,对象a的内容是'abc',但其实是指,a本身是一个变量,它指向的对象的内容才是'abc'

当我们调用a.replace('a','A')时,实际上调用方法replace是作用在字符串对象abc上的,而这个方法虽然名字叫replace,但却没有改变字符串abc的内容。相反replace方法创建了一个新字符串ABC并返回,如果我们用变量b指向该新字符串,就容易理解了,变量a仍指向原有的字符串abc,但变量b却指向新字符串abc了:

所以对于不变对象来说,调用对象自身的任意方法,也就不会改变该对象自身的内容。相反这些方法会创新新的对象并返回,这样就保证了不可变对象本身永远是不可变的。

小结

使用key-value存储结构的dict在Python中非常有用,选择不可变对象作为key很重要,最常用的key是字符串。

tuple虽然是不变对象,但试试吧(1,2,3)(1,[2,3])放入dict或set中,并解释结果。

以上就是Python基础之dict和set的使用详解的详细内容,更多关于Python dict set的资料请关注编程网其它相关文章!

--结束END--

本文标题: Python基础之dict和set的使用详解

本文链接: https://www.lsjlt.com/news/119927.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python基础之dict和set的使用详解
    目录dictset再议不可变对象小结dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言种也称为map,使用键-值(key-value)存储...
    99+
    2024-04-02
  • python基础之set集合详解
    一、set 集合 集合(set)是一个无序的不重复元素序列。 可以使用大括号 {} 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { ...
    99+
    2024-04-02
  • python--字典(dict)和集合(set)详解
    目录一、集合1.集合定义2.创建集合3.去重4.集合增删5.关系运算6.排序7.frozenset8.练习9.特性二、字典1.字典定义2.字典打印3.字典元素删除4.setdefau...
    99+
    2024-04-02
  • python3基础之集合set详解
    目录集合set1.集合定义2.集合基础操作固定集合1.定义2.作用基础操作集合set 1.集合定义 1.由一系列不可重复的不可变类型变量组成的可变映射容器 2.相当于只有键没有值的字...
    99+
    2024-04-02
  • Java基础之集合Set详解
    目录一、概述二、Set的常用方法三、Set的遍历3.1增强for循环3.2 迭代器遍历一、概述 Set是Java中的集合类,提供了一种无顺序,不重复的集合。常用的子类包括HashSe...
    99+
    2024-04-02
  • Python基础之类的定义和使用详解
    目录1、定义类2、创建类的实例3、“魔术”方法——_ init ()4、创建类的成员并访问4.1、创建实例方法并访问4.2、创建数据成...
    99+
    2024-04-02
  • Python中Dict和Set如何使用
    这篇文章将为大家详细讲解有关Python中Dict和Set如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 一、dictPython内置了字典:dict的支持,dict全称d...
    99+
    2023-06-15
  • Python集合之set和frozenset的使用详解
    目录简介构造基本使用交集、并集、差集、对称差集无交集、子集、超集运算符可用于 set 的操作简介 集合对象 set 是由具有唯一性的可哈希对象组成的无序多项集,如 list 不能哈希...
    99+
    2024-04-02
  • 怎么理解Python里的dict和set
    本篇内容主要讲解“怎么理解Python里的dict和set”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Python里的dict和set”吧!Python里的dict和set的效率有多高...
    99+
    2023-06-25
  • Python基础之模块详解
    目录一、模块1、模块的四种形式2、为什么要用模块?二、如何用模块1、import 模块名导入重命名:smt变量指向span模块的名称空间导入多个模块2、from 模块名 import...
    99+
    2024-04-02
  • Python基础之元类详解
    1.python 中一切皆是对象,类本身也是一个对象,当使用关键字 class 的时候,python 解释器在加载 class 的时候会创建一个对象(这里的对象指的是类而非类的实例)...
    99+
    2024-04-02
  • Python基础之进程详解
    目录一、前言二、基本用法三、创建单个进程四、创建多个进程五、进程池六、锁七、进程间通信八、信号量九、数据共享十、总结一、前言 进程,一个新鲜的字眼,可能有些人并不了解,它是系统某个运...
    99+
    2024-04-02
  • python基础之定义类和对象详解
    定义简单的类 面向对象是更大的封装,在一个类中封装多个方法,这样通过这个类创建出来的对象,就可以直接调用这些方法了! 定义只包含方法的类 在python中,要定义一个只包含方法的类,...
    99+
    2024-04-02
  • python链表的基础概念和基础用法详解
    本文为大家分享了python链表的基础概念和基础用法,供大家参考,具体内容如下 一、什么是链表 链表是由多个不同的节点组成,每个节点通过指针区域关联到一起链表的头指针,指向了头节点,...
    99+
    2024-04-02
  • Python基础之Spyder的使用
    目录Spyder是什么打开Spyder修改显示主题修改语言Spyder的核心构建块代码编辑区基本操作文件操作运行操作IPython控制台基本操作执行文件式编程执行交互式编程总结Spy...
    99+
    2023-05-18
    Spyder 基础 Python Spyder
  • Python基础之值传递和引用传递详解
    目录什么是值传递和引用传递可以干预参数传递是值传递还是引用传递么探寻一下值传递底层是如何实现的总结在python中,向函数传递参数的类型有两种,一种是值传递,还有一种是引用传递,如果...
    99+
    2023-05-18
    Python值传递 引用传递 Python值传递 Python 引用传递
  • python基础之//、/与%的区别详解
    目录示例代码如下:附:一分钟看懂Python中的 // 和 / 和 % 的用法区别总结“ // ” 表示整数除法,返回整数 比如 7/3 结果为2 &ldqu...
    99+
    2024-04-02
  • python基础之装饰器详解
    目录一、前言二、高阶函数三、函数嵌套四、装饰器4.1 被装饰方法带返回值4.2 被装饰方法带参数4.3 验证功能装饰器4.4 验证功能装饰器——带参数一、前言 装...
    99+
    2024-04-02
  • Python基础详解之描述符
    目录一、描述符定义二、描述符的种类和优先级三、描述符的应用四、描述符 + 类装饰器  (给 Person类添加类属性)五、利用描述符自定义 @property六、prope...
    99+
    2024-04-02
  • Java基础之详解HashSet的使用方法
    Java HashSet HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。 HashSet 允许有 null 值。 HashSet 是无序的,即不会记录...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作