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

1、泛映射类型

collections.abc 模块中有 Mapping 和 MutableMapping 这两个抽象类,他们的作用是为dict和其他类似的类型定义形式接口。

标准库里所有映射类型都是利用dict来实现的,因此他们有个共同的限制,只有可散列的数据类型才能用作这些映射里的键。

可散列的数据类型:在这个对象的生命周期中,他的散列值是不变的,而且这个对象需要实现__hash__()方法,还要有__eq__()方法。

▲ 原子不可变数据类型(str、bytes和数值类型)、frozenset都是可散列类型。

▲ 只有当一个元组包含的所有元素都是可散列类型的情况下,它才是可散列的。

字典提供了多种构造方法:

>>> a = dict(name='Li', sex='girl')

>>> b = {'name':'Li', 'sex':'girl'}

>>> c = dict(zip(['name','sex'], ['Li','girl']))

>>> d = dict([('name':'Li'), ('sex':'girl')])

>>> e = dict({'name':'Li', 'sex':'girl'})

>>> a == b == c == d == e

True

2、字典推导、默认值

2.1、字典推导

从任何以键值对作为元素的可迭代对象中构建出字典。

>>> DIAL_CODE = [

... (86,'China'),

... (1,'United States'),

... ]

>>> country_code = {country:code for code,country in DIAL_CODE}

{'China': 86, 'United States': 1}

>>> {country:code for country,code in country_code.items() if code > 50}

{'China': 86}

2.2、用setdefault处理找不到的键

在不进行二次查找的情况下更新列表

my_dict.setdefault(key, []).append(new_value)

# 等于

if key not in my_dict:

my_dict[key] = []

my_dict[key].append(new_value)

3、映射的弹性键查询

某个键在映射中不存在时,我们也希望通过这个键读取值的时候能得到一个默认值。

可以使用defaultdict类型,或者自定义一个dict的子类,实现__missing__方法。

▲、在实例化一个defaultdict的时候,需要给构造方法提供一个可调用对象,这个可调用对象会在__getitem__找不到键的时候被调用,让__getitem__返回某种默认值。

如:dd = defaultdict(list) , dd['new_key']

如果new_key在dd中不存在,表达式dd['new_key']会按如下步骤执行:

(1)、调用list() 建立一个新列表。

(2)、把这个新列表作为值,‘new_key’作为键,放到dd中。

(3)、返回这个列表的引用。

▲、这个用来生成默认值 list 的可调用对象存放在名为 default_factory的实例属性里。

▲、如果在创建defaultdict时没有指定 default_factory,查询不存在键会触发keyError 。

▲、defaultdict 里的 default_factory,只会在__getitem__里被调用(dd[k]),而dd.get(k)则会返回None。

特殊方法__missing__,只会被__getitem__调用。

提供__missing__方法对get或者__contains__(in 运算符会用到这个方法)这些方法的使用没有影响。

4、字典的变种

collections.OrderedDict:添加键的时候后会保持顺序

>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}

>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))

OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

collections.ChainMap:容纳不同的映射对象,查找操作时,这些对象被当作一个整体被逐个查找。

collections.Counter:整数计数器。 元素被存储为字典键,它们的计数被存储为字典值。

collections.USerDict:让用户继承写子类。对一个字典对象的封装。其实例的内容保存在一个普通的字典当中,可以通过 UserDict 实例的属性 data 访问。

5、不可变映射类型

types模块引入了一个封装类名叫MappingProxyType。如果给这个类一个映射,它会返回一个只读的映射视图。

>>> from types import MappingProxyType

>>> d = {'1':'one'}

>>> d_proxy = MappingProxyType(d)

>>> d_proxy

mappingproxy({'1': 'one'})

>>> d_proxy['1']

'one'

>>> d_proxy['2'] = 'two'

Traceback (most recent call last):

File "", line 1, in

TypeError: 'mappingproxy' object does not support item assignment

>>> d['2'] = 'two'

>>> d_proxy

mappingproxy({'2': 'two', '1': 'one'})

6、集合论

集合的本质是许多唯一对象的聚集。所以,集合可以用于去重。

集合中的元素必须是可散列的,set类型本身是不可散列的,但是forzenset可以。所以可以创建一个包含不同frozenset的set。

空集合:set()

集合同样有属于他的集合推导。

>>> from unicodedata import name

>>> {chr(i) for i in range(32,256) if 'SIGN' in name(chr(i),'')}

{'\xa2', '\xac', '§', '±', '\xa9', '\xb5', '\xae', '°', '$', '\xa3', '=', '+', '¤', '%', '÷', '<', '\xa5', '\xb6', '>', '#', '×'}

7、字典中的散列表

散列表是一个稀疏数组(总是有空白元素的数组)。散列表里的单元叫做表元。

在dict的散列表中,每一个键值对都占用一个表元,每个表元都有两个部分,一个是对键的引用,另一个是对值得引用。

所有表元的大小一致,所以可以通过偏移量来读取某个表元。

Python会设法保证大概还有三分之一的表元是空的,在快要达到阈值的时候,原有的散列表会被复制到一个更大的空间里面。

如果要把一个对象放入散列表,那么首先要计算这个元素键的散列值。

内置的hash()方法用于所有内置对象,自定义对象调用hash()实际上运行自定义的__hash__。

如果两个对象在比较时是相等的,那他们的散列值必须相等。如(1 == 1.0)

▲ 散列值在索引空间中尽量分散开,越是相似的但不相等的对象,散列值的差别应该越大。如(1.0001和1.0002)

散列表算法:为了获取my_dict[search_key]的值

(1)首先调用hash(search_key)计算search_key的散列值,把这个值最低几位数字当做偏移量,在散列表里查找表元。

(2)若找到的表元是空的,抛出KeyError异常

(3)若不为空,表元里会有一对found_key:found_value。进行检验search_key == found_key是否为真

(4)相等则返回found_value。不相等则称为散列冲突。

为了解决散列冲突,算法会在散列值中另外再取几位经过计算处理,把新得到的数字再当做索引来寻找表元。

一个可散列对象必须满足以下条件:

(1)支持hash()函数,并且通过__hash__()方法得到的散列值是不变的。

(2)通过__eq__()方法检测相等性。

(3)若a == b为真,则hash(a) == hash(b)也为真。

所有由用户自定义的对象默认都是可散列的。因为他们的散列值由id()来获取,而且他们都不相等。

▲ 字典在内存中开销巨大,典型的空间换时间。

▲ 键的次序取决于添加顺序

▲ 往字典添加新键可能会改变已有键的顺序(字典扩容决定)

set的实现:也依赖散列表,散列表里存放的只有元素的引用

集合里的元素必须是可散列的。

集合很消耗内存。

可以很高效地判断元素是否存在于某个集合

元素的次序取决于被添加到集合里的次序

往集合里添加元素,可能会改变集合里已有元素的次序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java继承与覆盖_简单的继承,方法重载与方法覆盖

[java]代码库package com.jiarui;public class Demo1 {public static void main(String[] args) {Dog dog1 new Dog(2,"大黄");System.out.println(dog1.name"的年龄为&#xff1a;"dog1.getAge());dog1.Cry();Cat cat1new Cat(3,"小花");cat1.C…

LINQ语句的两种语法实现方式

using System; using System.Linq;namespace LINQ语法实现 {class Program{static void Main(string[] args){int[] a { 3,1,2,4};//1.Query syntaxvar Query1 from num in a where num % 2 0 orderby num select num;foreach (var i in Query1){Console.WriteLine("{0…

圣杯布局

先看看效果&#xff08;1&#xff09;左边固定宽度&#xff0c;右边自适应 <!DOCTYPE html> <html> <head><title>shengbei</title><meta charset"utf-8" /><style type"text/css">*{margin:0px;padding: 0px;}…

【C语言简单说】四:常量

常量和变量是一种相对的概念&#xff0c;在这里我开始跟大家说说常量和变量的区别。可能前几节的小伙伴们并没有能感受出来&#xff0c;不过有了常量的对比那么将会有很好的理解。 .._|||||.. 头昏眼花 常量&#xff0c;就是一些固定的数据&#xff0c;也就是说你把数据装到…

虚幻4 碰撞过滤

原创翻译&#xff0c;转载请注明出处。&#xff08;http://blog.csdn.net/sinat_24229853/article/details/51090259&#xff09; 英文原文&#xff1a;https://www.unrealengine.com/blog/collision-filtering?langzh-CN 选择什么样的碰撞显然是很重要的。但它可能会很棘手&…

基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客?

前言OK&#xff0c;我也来造轮子了博客系统从一开始用WordPress&#xff0c;再到后来用hexo、hugo之类的静态博客生成放github托管&#xff0c;一直在折腾折腾是为了更好解决问题&#xff0c;最终还是打算自己花时间搞一个好了本系列文章将记录博客的开发过程~ 将会持续更新&am…

linux之dig命令

1 dig命令的作用 一般我们可以用dig命令解析域名成ip,或者把ip解析成域名,或查看这个域名所经过的域名服务器,这点是 nslookup命令没有的功能. DNSpod:注册域名,首先得找到域名注册商,国内的比较著名的有DNSpod 2 一般使用 1) 解析域名成ip dig 域名 这里测试 dig ww…

Diocp截图

跑了个数据库的查询和插入&#xff0c;删除。 Http SVR DEMO http://123.232.98.202:8081/

C#中泛型在Class上的实现

using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace ConsoleApplication1 {class Program{static void Main(string[] args){GenericArray<int> intArray = new GenericArray<int>(5);//实例化一个泛型的数组for (i…

mysql与oracle在软件测试_Oracle和MySQL的一些简单命令对比

SQL> select to_char(sysdate,yyyy-mm-dd) from dual;SQL> select to_char(sysdate,hh24-mi-ss) from dual;mysql> select date_format(now(),%Y-%m-%d);mysql> select time_format(now(),%H-%i-%S);日期函数增加一个月&#xff1a;SQL> select to_char(add_mon…

【C语言简单说】五:常用运算符

其实。。。这一节我我猜大家几分钟就会了&#xff08;&#xff09;…(⊙_⊙;)… ○圭~○列~~怎麼酱&#xff1f; 因为我相信大家的智商&#xff0c;我就随便给大家提一下就好了。我们看以下的代码&#xff1a; #include<stdio.h> #include<stdlib.h> int main(){…

关系型数据库

1、关系型数据库 关系型数据库&#xff1a;是一种建立在关系模型&#xff08;数学模型&#xff09;上的数据库。 关系模型&#xff1a;一种所谓建立在关系上的模型。关系模型包含三个方面&#xff1a; 数据&#xff1a;数据存储的问题&#xff0c;二维表&#xff08;有行和列&a…

python中lines是什么类型_Python中splitlines()方法的使用简介

splitlines()方法返回一个字符串的所有行&#xff0c;可选包括换行符列表(如果num提供&#xff0c;则为true) 语法 以下是splitlines()方法的语法&#xff1a; str.splitlines( numstring.count(\n)) 参数 num -- 这是任何数&#xff0c;如果存在它会被认为换行需要被包括行数。…

关于Unity中的本地存储

本地存储 在做游戏的时候&#xff0c;经常需要在本机存储一些数据&#xff0c;比如闯关类游戏要记录闯到第几关&#xff0c;做单机的时候要把数据保存到本地&#xff0c;下次启动的时候数据存在&#xff0c;就是把数据保存到磁盘里面或者手机的flash闪存里面。 Unity使用Player…

linux之history和!命令联合使用

1 问题 linux平台查找过去的使用的命令 2 解决方法 1&#xff09;history和! id联合使用 输入histroy命令&#xff0c;部分 显示如下 2008 echo 11 > 1.txt 2009 histroy 然后!id &#xff01;2008 echo 11 > 1.txt 如果&#xff01;&#xff08;命令的一部分&am…

sql 注入神器sqlmap 源码分析之调试sqlmap

为什么80%的码农都做不了架构师&#xff1f;>>> 相信大家平时 用sqlmap 命令&#xff0c;比如 python sqlmap.py -u"https://team.oschina.net/action/team/create" --data"nameonlyGuest&identonlyGuest&sidentonlyGuest&temp1431349…

【鉴权/授权】自定义一个身份认证Handler

微信公众号&#xff1a;趣编程ACE关注可了解.NET日常开发技巧。如需源码&#xff0c;请公众号留言 [源码];上文回顾【鉴权/授权】一步一步实现一个简易JWT鉴权自定义身份验证CustomerAuthenticationHandler使用上篇文章我演示了如何利用.net core 里面内置的验证方案-Bearer 进…

java把对象转成json_java 把对象 对象转换成json字符串 | 学步园

publicclassJSONCreateDemoActivity {//创建以下的JSON对象publicString createJSONObject() {Gsongson newGson();Configurationcon1 newConfiguration();con1.setDisplay(true);con1.setFillColor("#FF0000");con1.setID(1);con1.setLineColor("#FF0000&quo…

【C语言简单说】六:取模运算符以及变量的扩展

┴┴ &#xff08;╰(&#xff40;□′)╯&#xff08; ┴┴ … 这一节我们就来说另外的运算符——取模运算符&#xff08;说白了跟取余数差不多…&#xff1c;—_-)&#xff01;&#xff01;&#xff01;&#xff09; 先看看好难懂的定义&#xff1a;取模运算和取余运算两个…

Android Studio开发基础之Activity之间参数传递

一、简单数值传递 1、MainActivity protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {@Overridepublic void o…