python_dic与set

1.list,dict

names=['A','B','C']

score=[90,80,60]

用list给定名字找对应成绩用时长,内存小

用dict,名字-成绩对照表,速度快,内存大,用空间换取时间

>>>d={'A':90,'B':80,'C':60}

>>>d['A']

90

2.将数据放入dict的两种方法:

  1. >>>d={'A':32,'B':34,'C':12}       #数据初始化时指定
  2.  >>>d['A']=32                           #通过key放入,可以放入很多数据key,key放入顺序与dict存放顺序无关

          >>>d['A]

           32       

3. 多次对一个key存入value时,取最后的值

>>>d['A']=90

>>>d['A']

90

>>>d['A']=20

>>>d['A']

20

4.如果key不存在,会报错

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

5.避免key不存在的错误,两种判断key是否存在的方法

1.通过 in 判断

>>>'A' in d

False                #即不存在

2.通过dict提供的 get()

如果key不存在,返回 none ,在python交互环境中不显示结果

key不存在,返回自己指定的值

>>>d.get('D')

>>>d.get('D',-8)

-8

6.删除key   用 pop(key)

 >>>d.pop('C')

60

>>>d

{'A':90,'B':80}

7.dict内部存放的顺序与key放入的顺序是没有关系的

dict的key必须是 不可变对象

这是因为dict根据key来计算value的存储位置,如果计算相同的key得出的结果不同,那dict内部将会完全混乱,该算法称为哈希算法(Hash)

为保证hash的正确性,key的对象不可变,如str字符串,d整数。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

1.set是key的集合,不存储value,在set中没有重复的key ,且key无序

list作为输入集合来创建一个set

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

>>>s

{1,2,3,4}

或者直接s={key1,key2,key3}    #key不可变

传入的参数[1,1,2,2,A,A,3,3]是一个list,而{1,2,3,4}表示该set内有4个元素,list内重复元素会被自动过滤

2.添加元素 add(key)可以重复添加,但不会有效果

>>>s.add(5)

>>>s

{1,2,3,4,5}

>>>s.add(5)

>>>s

{1,2,3,4,5}

3.删除元素 remove(key)

>>>s.remove(5)

>>>s

{1,2,3,4}

4.set是数学意义是无重复元素的无序集合,可以作交、并集等操作

>>>s1 &s2  #交集

>>>s1| s2   #并集

5.set没有存储对应的value,同样不可以放入可变对象如list

6.议可变与不可变对象 如list、str

对list操作,内容会变化

>>>a=['c','b','a]

>>>a.sort()     #排序

>>>a

['a','b','c']

对str操作,即使创造新对象,原变量指向对象不改变

>>>a='abc'

>>>b=a.replace('a','A')       # 替代 将'abc'中的 ‘a’换成 ‘A’, 并将变量b指向新字符串'Abc'

>>>b

'Abc'

>>>a

'abc'

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

┌───┐                  ┌───────┐
│ a │─────────────────>│ 'abc' │
└───┘                  └───────┘

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

┌───┐                  ┌───────┐
│ a │─────────────────>│ 'abc' │
└───┘                  └───────┘
┌───┐                  ┌───────┐
│ b │─────────────────>│ 'Abc' │
└───┘                  └───────┘

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

7.小结:

使用key-value存储结构的dict非常有用,要选择不可变对象作为key,常用str字符串

tuple元组是不变对象,(1,2,3)可放入dict或set

但(1,2,[4,6])不能放入dict或set中,因为其中的[4,6]list是可变对象,会报错

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值