IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> python的字典与集合 -> 正文阅读

[数据结构与算法]python的字典与集合

介绍

在Python中,字典与集合的实现方式都采用散列表(hash table)实现,集合是值为空的特殊字典。Python语言自身的实现中也广泛使用到了字典,如模块的命名空间、实例的属性记录中。字典要求键是可散列的(hashable),在Python中,一个对象是可散列的是指该对象在生命周期内散列值是不变的,需要在类中实现__hash__()__eq__()两个方法, __hash__()用于计算散列值, __eq__()用于比较散列值是否相等.

dict.setdefault()

即要在dict中查找元素,又要向dict中添加未查找的元素及值时很有用,相比普通的实现方式,减少查表次数,提高运行效率

根据键获取值,如果没有该键,则存入该键及值,并返回该值。使用示例如下所示:

"""Build an index mapping word -> list of occurrences"""
import re
import sys

WORD_RE = re.compile(r'\w+')
index = {}
with open('03-dict-set\zen.txt', encoding='utf-8') as fp:
    for line_no, line in enumerate(fp, 1):
        for match in WORD_RE.finditer(line):
            word = match.group()
            column_no = match.start() + 1
            location = (line_no, column_no)
            index.setdefault(word, []).append(location)

# display in alphabetical order
for word in sorted(index, key=str.upper):
    print(word, index[word])

其中,index.setdefault(word, [])表示若word不在字典中,则存入该word,并将其对应的值设定为[],并返回该值(空列表的引用)。

collections.defaultdict(one_callable)

同上, 在即要在dict中查找元素,又要向dict中添加未查找的元素及值时也是很有用的,相比普通的实现方式,减少查表次数

这个类型在构造方法里可以传入一个可调用对象,当出现未找到键的情况,则会调用该可用对象,其实现机理是在类里定义了一个default_factory用于存储用户定义的可调用对象,后这个对象在__missing__()中被调用。

__missing__()

所有的映射类型在处理找不到键的情况都会牵涉到使用__missing__()方法。__missing__()方法只会被__getitem__()方法调用. 如d[k]会调用__getitem__(), 而__getitem__()就会调用__missing__(). 但get()in方法并不会调用__missing__(),因为它们里面并没有调用它, 其中get()方法是有单独实现的,而in__contain__()方法实现.
另外, 在Python3中,k in my_dict.keys()中,dict.keys()返回的是一个’视图’,视图就像一个集合,在视图中查找元素是很快的.

不可变的映射类型

对于有些映射变量, 我们只希望其能被用户能读取, 不希望其被改动, 可以通过为该映射类型定义一个视图变量来实现该功能, 只把视图变量返回给用户调用, 视图是动态的, 可以根据变量自动改变,但不可以通过视图改变变量的值, 以下为一个小示例:

from types import MappingProxyType
d = {1:'a'}
d_proxy = MappingProxyType(d)

d为原变量,d_proxy为视图变量,d_proxy不可改动,而d可以改动.

集合

数学运算符号表示python实现
交集 s ∪ z s\cup z szs&z
并集 s ∩ z s\cap z szs|z
差集 s ? z s\setminus z s?zs\z
差集 s ? z s\setminus z s?zs\z
对称差集 s Δ z s \Delta z sΔzs^z
属于 e ∈ z e\in z ezs in z
是否为子集 s ? z s \subseteq z s?zs<=z
是否为真子集 s ? z s \subset z s?zs<z

字典与集合的特点

  • 内存开销巨大
  • 键的存储次序与添加顺序有关
  • 往字典里添加新键可能会改变已有键的顺序
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-22 11:11:28  更:2021-10-22 11:13:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:47:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码