dict 和 set

dict:

简介:

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

为什么要使用dict:

     假如需要根据同学的名字查找对应的成绩,如果使用list实现,那么则需要两个list

   names=['Michael','Bob','Tracy']

   scores=[95,75,85]

   给定一个名字,要查找对应的成绩,就先要在names中查找相应的位置,

  再从scors取出对应的成绩,list越长,耗时越长。

   如果用dict实现,只需要一个“名字-成绩”的对照表,直接根据名字查找成绩,无论这个表多大,查找速度都不会慢。

实例:

d={'Michae1':95,'Bob':'dfs','Tracy':85}
d['Bob']
'dfs'

格式:{'key1':value1,'key2':value2,'key3':value3}   注:目前推测这个value 的数据类型有很多种

原理:

           对于给定的key值,dict在内部就可以直接计算出Bob对应的位置,也就是对应的value对应的内存地址,直接取出来,所以速度很快。

          对于这种数据类型而言,在放进的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value

把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

       

1.通过key值放入
d['Adam']=67
d
{'Michae1': 95, 'Bob': 'dfs', 'Tracy': 85, 'Adam': 67}
d['Adam']
67
2.对同一个key再次赋值的话,会把之前的value值覆盖

d['Adam']=60
d['Adam']
60
3.当访问相应key值时,key如果不存在的话,那么则会报错
d['s']
KeyError                                  Traceback (most recent call last)
<ipython-input-10-59d6658a9261> in <module>()
----> 1 d['s']

KeyError: 's'
   
    避免这种情况的出现有两种办法。
    3.1 通过 in 判断 key 是否存在
        'Adam' in d
        True
    3.2  通过dict提供的get方法,如果key不存在,那么返回None,或者自己指定的value:
        d.get('Adam')
        60
        print(d.get('B'))   #在命令行下 d.get('B') 不会有显示
        None
        print(d.get('B',-1))
        -1 
       

dict与list 的比较:

dict的特点:

     1.查找速度快,不会随着key的增加而增加

      2.需要占用大量的内存,内存浪费严重、

;ist的特点:

     1.插入删除的实践随元素的增加而增加

     2.占用空间小,内存浪费小

dict是用空间换时间。

牢记:

       dict的key必须是不可变对象。

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

        在Python中,字符串、整数等都是不可变的,因此,可以放心的作为key。而list 是可变的,就不能作为key:

      

key=[1,2,3]
d[key]="a list"

TypeError                                 Traceback (most recent call last)
<ipython-input-21-44a38dbf38f6> in <module>()
----> 1 d[key]="a list"

TypeError: unhashable type: 'list'

 

set

    1.简介

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

      2.创建set

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

  

s=set([1,2,3,'df'])
s
{1, 2, 3, 'df'}

                注:2.1.这里传入的参数[1,2,3,df]是一个list,然而显示的[1,2,3,'df']只是表明这个set内部有1,2,3,'df',有这四个元素,显示的顺序也不表示这个set是有序的。

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

    

s=([1,2,3,4,1,2])
s
{1, 2, 3, 4}

3. 常用函数

      3.1 add(key) #key 为要添加的值,可以重复添加,但不会有效

      

s=set([1,2,3,4])
s.add(5)
s
{1, 2, 3, 4, 5}
  
#重复添加
s.add(5)
s
{1, 2, 3, 4, 5}

# 使用add()  每次只能用一次
s.add(5,6)
TypeError                                 Traceback (most recent call last)
<ipython-input-12-964836f1bade> in <module>()
----> 1 s.add(5,6)

TypeError: add() takes exactly one argument (2 given)

    3.2  remove(key) 方法可以移除元素

    

s=set([1,2,3,4,5])
s.remove(5)
s
{1, 2, 3, 4}
# 同样的 每次只能移除一个值

4. set可以做数学意义上的交集、并集等操作.

  

3.1 使用& 来求交
s1=set([1,2,3,45,6])
s2=set([1,2,3,4,5,6])

s3=s1 & s2

s3
{1, 2, 3, 6}

3.2 使用| 来求交
s1 | s2
{1, 2, 3, 4, 5, 6, 45}

三.set 和 dict的联系和区别

         set和dict的原理是相同的,所以同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set 内部

不会有重复元素。

      set和dict相比只是 没有储存相对应的value值而已。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值