什么是字典以及字典的特性

一  什么是字典

dict全称dictionary,使用键-值(key-value)存储,value值可以是任意数据类型: int,float,long, complex, list, tuple,set, dict

1) 定义一个空字典

定义空字典:{ } ,dict( )

2) 根据已有的数据创建字典

d = dict(a=1, b=2)
print(d, type(d))

users = ['user1', 'user2']
passwds = ['123', '456']

可以将两个列表转换成列表里面嵌套元组,也可以直接将其转换成字典

二  字典的特性

1)

字典同集合一样,只支持成员操作符

成员操作符, 默认判断key值是否存在

2)  for循环

for循环: 默认遍历字典的key值

for+index:

3) fromkeys第一个参数可以列表/tuple/str/set, 将列表的每一个元素作为字典的key值,
并且所有key的value值一致, 都为'000000';
print({}.fromkeys({'1', '2'}, '000000'))

eg:随机生成100张卡号, 卡号的格式为610 334455 001 ---610 334455 100,其密码都为666666

三   字典的增删改查

1) 增加

1>    d = dict(a=1, b=2)
d['g'] = 10  #字典中没有,为添加
d['a'] = 10  #字典中已存在,为修改
print(d)

2>    update:
 # 如果key值已经存在, 更新value值;
 # 如果key值不存在, 添加key-value值;
 d.update({'a':4, 'f':1})
 print(d)

3>   setdefault

# 如果key值已经存在, 不做修改;
# 如果key值不存在, 添加key-value值;默认情况下value值为None
d.setdefault('g', 10)
print(d)

2)  删除

1>  pop:弹出指定key-value值

2>  popitem:

3>  del:

4>  clear:

3) 修改,查看

services = {  ' http ' : 80 , ' mysq l ' : 3306  }

查看字典里面所有的key值
print(services.keys())

查看字典里面所有的value值
print(services.values())

查看字典里面所有的key-value值
print(services.items())

4) 遍历:

1>  直接的遍历value值

2>  间接的遍历value值

5)  查看指定key对应的value值

注意: key不存在, 就会报错

判断key值存不存在

6)  get方法获取指定可以对应的value值

 如果key值存在, 返回对应的value值;
如果key值不存在, 默认返回None, 如果需要指定返回的值, 传值即可

7) 列表的去重

1>  转换为集合(集合是不能重复的)

li = [1, 2, 3, 4, 65, 1, 2, 3]
print(list(set(li)))

2>  通过字典的方式去重(字典的key值是不能重复的)

li = [1, 2, 3, 4, 65, 1, 2, 3]
print({}.fromkeys(li).keys())

四  关于字典的一些案例分析

1)  重复的单词: 此处认为单词之间以空格为分隔符, 并且不包含,和.;
  1. 用户输入一句英文句子;
  2. 打印出每个单词及其重复的次数

method 1:

method 2:

2)  swhich语句

python里面不支持switch语句

但是可以通过字典来间接实现swhich功能

也可以通过字典的 get 功能来更加快速的实现

五  is  和  == 的区别

变量:
         id: 在内存中存储的位置;id(a)
         value:==
         type:变量的数据类型;type(a)
==:value, type
is: 三个都判断

如果:a is b ====> True, a==b一定相等, 返回True;
但是,a==b ====> True,  a is b 不一定

六  深拷贝和浅拷贝的区别

直接赋值(li1 = li): 只传递对象的引用, li1指向对象li的内存地址空间,
    因此, 原有列表li改变, 被赋值的li1也会做相应的改变.

浅拷贝(三种实现方式 eg: li2=li.copy()):li和li2的内存地址不同,
    但是子对象的内存地址相同, 因此,原始数据改变 , 子对象也改变.

深拷贝(import copy, eg: li3=copy.deepcopy(li)), li和li3的内存地址不同,
         包含子对象的拷贝, 所以原始对象改变并不会造成深拷贝里面任何子项的改变.

### 当深拷贝和浅拷贝, 针对的对象全部是不可变数据类型时, 两者效果相同;
### 当深拷贝和浅拷贝, 针对的对象包含是可变数据类型时, 两者才有上述区别

 浅拷贝的实现:
   - li . copy (  )
   - li [ : ]
   - copy . copy (  li  )

实现深拷贝:
  - copy . deepcopy(  li  )

猜你喜欢

转载自blog.csdn.net/weixin_42668123/article/details/81674440