参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017104324028448

dict是字典,可以储存键值对类型的值,set与dict相同,只是set只储存key值,而不储存value。

补充:

  python中数值类型(int、float)、元组str是不可变对象,而列表list、字典dict、集合set是可变对象

  list.cout('a')查看list中'a'的个数

>>> l
['a', 2]
>>> l.count('a')

List

  问题:list index out of range 和 list assignment index out of range的原因

>>> a=[[],[],[1]]
>>> a[0][-1]=5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range#是再下标溢出的情况下依旧分配值的时候出现的异常
>>> a[0][-1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range#是访问的下标超出了list的地址
>>> a[0][1]=5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> a[0][1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>>

  

dict

  

a={'sex':'nan'}
>>> 'sex' in a#默认在key中检查
True
>>> 'nan' in a
False
>>> 'sex' in a.values()
False
>>> 'nan' in a.values()
True
>>> 'sex' in a.keys()
True
>>>

  

  dict又称map,他以键值对的形式储存数据,并且为了查找方便,在存储数据的时候,会根据key的值去计算应该放置的位置。为了保证计算位置的算法的结果不冲突,所以就要求dict数据的key值不能重复。由于这种特性,使得在查找数据时,与list的从头开始查找相比,dict中储存的数据查找时极快的,但是对空间有些浪费,因为常规情况下的带储存数据经过算法处理后,并不会无间隔的紧密的按顺序放置在内存中,而是分散的。

  dict内部存放的顺序和key放入的顺序是完全没有关系的

  dict的key必须是不可变对象,因为dict内使用hash计算key存放的位置,如果每次计算相同的key得出的结果不同,就会造成key的混乱,如果用可变对象当作key,会报错

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

  

dict的一些方法和特性

  一个key只能对应一个value

  可以通过in判断是否存在(只匹配key,不匹配value)

>>> l={'a':'1','b':'2'}
>>> 'a' in l
True
>>> '1' in l
False

  还可以通过 get() 方法获取指定key的内容,若key不存在,返回None,或者返回自己指定的内容

>>> l.get('a')
'1'
>>> l.get('1')#返回None
>>> l.get('1',aaa)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'aaa' is not defined#因为必须写“aaa”
>>> l.get('1',1111)
1111
>>>

  使用 pop(key) 方法删除指定的key值

  使用remove()删除list中的index

  参考链接:https://blog.csdn.net/u013066730/article/details/85260764

  使用dict一定要注意,dict的key一定是不可变对象,在Python中,字符串、整数等都是不可变的,而list是可变的。

list与dict的区别:

  两者之间的区别主要在于查找速度和对储存的使用率上面

  1)list的查找速度会随着存放数据的数量的增加而增加,但占用的内存小,浪费内存还小。

  2)dict的查找速度极快,不会受存放数据数量大小的影响,但占用内存大,浪费空间多。

set

   set 和dict类似,也是一组 key 的集合,但不储存 value ,同样的key不能重复。

  使用一个list作为输入创建set

>>> s=set([1,2,'a'])#注意创建时传入的参数是一个list
>>> s
{1, 2, 'a'}#这样显示并不代表set是有序的
>>> s=set([1,2,'a','a'])
>>> s
{1, 2, 'a'} #不重复
>>>

  使用 add(key) 添加 key 到 set 中

>>> s.add('b')
>>> s.add('a')#重复添加没有效果
>>> s
{1, 2, 'a', 'b'}

  使用 romove(key) 删除

set 可以看作为数学意义上的一个集合,这个集合中的元素是无序的、是不重复的,可以做数学意义上的交集、并集操作。

>>> b=set([3,4,'d'])
>>> s&b#交集
set()
>>> b
{'d', 3, 4}
>>> s|b#并集
{1, 2, 'a', 3, 4, 'b', 'd'}
>>>

  不能添加可变元素,注意:tuple虽然是不可变元素,但是包含可变元素的tuble也不行

>>> b.add([5,6])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
AttributeError: 'tuple' object has no attribute 'add'
>>> b.add((1,2,[3,4]))#tuple中包含了可变元素list
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>>

  

  

可变与不可变对象

  不可变对象就是虽然看起来对他的改变会生效,是因为其返回一个新的对象。如

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

  而可变对象如 list

>>> l=[1,2]
>>> l
[1, 2]
>>> l[0]='a'
>>> l
['a', 2]
>>>

  

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

 

  

python 基础使用list、dict、set、可变与不可变对象的更多相关文章

  1. python基础之字典dict和集合set

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7043642.html python基础之字典dict和集合set 字典dic ...

  2. python基础04--list,cou,dict

    1.1 列表list 1.列表可以完成大多数集合类的数据结构实现.列表中元素的类型可以不相同,它支持数字,字符串,列表,元组,集合,字典 2.列表是有序的, 可以索引,切片 3.List中的元素是可以 ...

  3. Python基础——字典(dict)

    由键-值对构建的集合. 创建 dic1={} type(dic1) dic2=dict() type(dic2) 初始化 dic2={'hello':123,'world':456,'python': ...

  4. Python 基础数据类型之dict

    字典是另一种可变容器模型,且可存储任意类型对象.字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:d = {k ...

  5. python基础之五:dict 字典

    1.数据类型的划分:可变数据类型.不可变数据类型 不可变的有:元组(tuple).字符(str).整型(int).布尔型(bool) 它们都可以哈希 可变的:列表(list).set.字典(dict) ...

  6. Python基础教程之dict和set

    1. dict Python中的dict等于js中的 map ,使用键-值(key-value)存储,具有极快的查找速度. 如果 我们要根据同学的姓名去查找他的成绩在不用dict的情况下.就需要两个l ...

  7. python基础类型(字典:dict)

    字典的介绍: 字典(dict)Python中唯一的一个映射类型.他是以{}括起来的键值对组成,在dict中key是唯一的.在保存的时候,根据key来计算出一个内存地址,然后将key-value保存到这 ...

  8. Python基础数据类型(五) dict字典

    字典dict{} 字典数字自动排序 enumerate 枚举 for i,k in enumerate(dic,1) #第二个参数默认不写就是0 ---枚举 print(i,k) dict,以{}来表 ...

  9. python基础之字典dict

    不可变数据类型:tuple.bool.int.str --可哈希类型可变数据类型:list.dict.set --不可哈希类型dict-key 必须是不可变数据类型,可哈希dict-value 任意数 ...

  10. python基础day6_字典dict

    数据类型划分:可变数据类型.不可变数据类型 不可变数据类型(又叫可哈希):元祖,bool ,int,str, 可变数据类型(又叫不可哈希):list,dict,set(集合) dict的key必须是不 ...

随机推荐

  1. springMVC下ajax获取后台参数直接走错误或者报406错误问题解决

    直接走错误: 返回的结果是否json化,直接返回非字符串的结果会走ajax的error函数. 报406错误: 我在学习springmvc过程中(我的项目是配置的后缀是.html),从controlle ...

  2. C#.Net版本自动更新程序及3种策略实现

    C#.Net版本自动更新程序及3种策略实现 C/S程序是基于客户端和服务器的,在客户机编译新版本后将文件发布在更新服务器上,然后建立一个XML文件,该文件列举最新程序文件的版本号及最后修改日期.如程序 ...

  3. Page Layout里的javascript (jquery)不执行

    在page layout 中通过 _spBodyOnLoadFunctionNames.push("js 方法名") 的方式实现. 但切记,代码要放到 PlaceHolderMai ...

  4. Android封装类似微信的顶部TitleBar弹出的PopupWindow代码

    Android仿微信顶部titlebar,点击加号弹出的PopupWindow,是封装好的PopupWindow,直接拿来用即可,先看效果图:  调用代码非常简单,这是MainActivity的代码: ...

  5. Ubuntu 16.04下安装64位谷歌Chromium(Chrome)浏览器

    在命令行下输入: sudo add-apt-repository ppa:a-v-shkop/chromium sudo apt-get update sudo apt-get install chr ...

  6. C# HttpHelper万能框架实现 接口

    POST请请求是使用Http协议与请求的URL进行连接,然后再写入数据,最后关闭连接的过程 方法(1) //要Post的数据 string postdate = "a=123&c=4 ...

  7. 关于zabbix 的lld的web界面的配置

    lld脚本在配置文件中例子: UserParameter=lldisk,/bin/bash /script/lldisk.sh disk_count 1.监控项 2.监控项原型

  8. oc语言的特点

    oc语言的特点分为以下几个方面: 1.运行时: 2.block闭包: 3.内存管理: 4.大中枢派发: 一.运行时的基础是isa 类结构:由clang编译前端支撑. 从它衍生出以下几个特征: 1.消息 ...

  9. ActiveMQ学习笔记(16)----Message Dispatch高级特性(二)

    1. Optimized Acknowledgetment ActiveMQ缺省支持批量确认消息,由于批量确认会提高性能,如果希望在应用程序中禁止经过优化的确认方式,可以采用以下几种方式: 1. 在C ...

  10. c++string类的简单介绍

    #include "iostream" #include "string" using namespace std; /*@author:浅滩 *family: ...