python入门学习之字典

一、字典

  • 字典属于一种新的数据结构,称为映射(mapping)
    - 字典的作用和列表类似,都是用来存储对象的容器
    - 列表存储数据的性能很好,但是查询数据的性能的很差
    - 在字典中每一个元素都有一个唯一的名字,通过这个唯一的名字可以快速的查找到指定的元素
    - 在查询元素时,字典的效率是非常快的
    - 在字典中可以保存多个对象,每个对象都会有一个唯一的名字
    这个唯一的名字,我们称其为键(key),通过key可以快速的查询value
    这个对象,我们称其为值(value)
    所以字典,我们也称为叫做键值对(key-value)结构
    每个字典中都可以有多个键值对,而每一个键值对我们称其为一项(item)

二、创建字典

方式一:

使用{}来创建字典
d = {} # 创建了一个空字典

方式二:使用 dict()函数来创建字典:

d = dict(name='孙悟空', age=18, gender='男')
print(d, type(d))  # {'name': '孙悟空', 'age': 18, 'gender': '男'} <class 'dict'>

方式三:

也可以将一个包含有双值子序列的序列转换为字典
双值序列,序列中只有两个值,[1,2] (‘a’,3) ‘ab’
子序列,如果序列中的元素也是序列,那么我们就称这个元素为子序列

d = dict([('name', '孙悟饭'), ('age', 18)])
print(d, type(d))  # 'name': '孙悟空', 'age': 18, 'gender': '男'} <class 'dict'>

2、语法

  {key:value,key:value,key:value}
  字典的值可以是任意对象。
  字典的键可以是任意的不可变对象(int、str、bool、tuple ...),但是一般我们都会使用str
      字典的键是不能重复的,如果出现重复的后边的会替换到前边的
name = {'name': '孙悟空', 'age': 18, 'gender': '男', 'name': 'sunwukong'}
print(name , type(name))  # {'name': 'sunwukong', 'age': 18, 'gender': '男'} <class 'dict'>

# 根据键来获取值
print(name['name'], name['age'], name['gender'])  # sunwukong 18 男

# 如果使用了字典中不存在的键,会报错
 print(d['hello'])   #KeyError: 'hello'

三、字典的基本操作

1、len():获取字典中键值对的个数

d = dict(name='孙悟空', age=18, gender='男')
print(len(d))  # 3

2、 in 和 not in

in 检查字典中是否包含指定的键
not in 检查字典中是否不包含指定的键

d = dict(name='孙悟空', age=18, gender='男')
print('hello' in d)  # False

四、获取字典中的值

方式一:根据key来获取

d = {'name': '孙悟空', 'age': 18, 'gender': '男'}
print(d['age'])  # 18

# 通过[]来获取值时,如果键不存在,会抛出异常 KeyError

name = {'name': '孙悟空', 'age': 18, 'gender': '男'}
print(name['hello'])  # KeyError: 'hello'

方式二:通过get()方法来获取

get(key[, default]) 该方法用来根据键来获取字典中的值
如果获取的键在字典中不存在,会返回None
也可以指定一个默认值,来作为第二个参数,这样获取不到值时将会返回默认值

name = {'name': '孙悟空', 'age': 18, 'gender': '男'}
print(name.get('age'))  # 18

name = {'name': '孙悟空', 'age': 18, 'gender': '男'}
print(name.get('hello'))  # None
print(name.get('hello', '默认值'))  # 默认值

五、修改字典中的值

方式一:通过获取key来修改对应的值

d[key] = value 如果key存在则覆盖,不存在则添加.

dict1 = {'name': '孙悟空', 'age': 18, 'gender': '男'}
print('字典修改前:', dict1)
dict1['name'] = 'sunwukong'  # 修改字典的key-value
print('字典修改后:', dict1)

控制台打印:
字典修改前: {'name': '孙悟空', 'age': 18, 'gender': '男'}
字典修改后: {'name': 'sunwukong', 'age': 18, 'gender': '男'}

dict1 = {'name': '孙悟空', 'age': 18, 'gender': '男'}
print('字典修改前:', dict1)
dict1['address'] = '花果山'  # 向字典中添加key-value
print('字典修改后:', dict1)

控制台打印:
字典修改前: {'name': '孙悟空', 'age': 18, 'gender': '男'}
字典修改后: {'name': '孙悟空', 'age': 18, 'gender': '男', 'address': '花果山'}

方式二:setdefault(key[, default]) 可以用来向字典中添加key-value

如果key已经存在于字典中,则返回key的值,不会对字典做任何操作
如果key不存在,则向字典中添加这个key,并设置value

dict1 = {'name': '孙悟空', 'age': 18, 'gender': '男'}
print('字典修改前:', dict1)
result = dict1.setdefault('name', '猪八戒')
print('result=', result)
print('字典修改后:', dict1)

控制台打印:
字典修改前: {'name': '孙悟空', 'age': 18, 'gender': '男'}
result= 孙悟空
字典修改后: {'name': '孙悟空', 'age': 18, 'gender': '男'}

dict1 = {'name': '孙悟空', 'age': 18, 'gender': '男'}
print('字典修改前:', dict1)
result = dict1.setdefault('hello','猪八戒')
print('result=', result)
print('字典修改后:', dict1)

控制台打印:
字典修改前: {'name': '孙悟空', 'age': 18, 'gender': '男'}
result= 猪八戒
字典修改后: {'name': '孙悟空', 'age': 18, 'gender': '男', 'hello': '猪八戒'}

六、update()

将其他的字典中的key-value添加到当前字典中
如果有重复的key,则key对应的值后边的会替换到当前的。

d = {'a': 1, 'b': 2, 'c': 3}
d2 = {'d': 4, 'e': 5, 'f': 6, 'a': 7}
d.update(d2)
print(d)  # {'a': 7, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}

七、字典删除

方式一:

删除,可以使用 del 来删除字典中的 key-value

d = {'a': 1, 'b': 2, 'c': 3}
print('删除之前:', d)
del d['a']
del d['b']
print('删除之后 ', d)  

控制台打印:
删除之前: {'a': 1, 'b': 2, 'c': 3}
删除之后  {'c': 3}

方式二:popitem()

随机删除字典中的一个键值对,一般都会删除最后一个键值对.
删除之后,它会将删除的key-value作为返回值返回
返回的是一个元组,元组中有两个元素,第一个元素是删除的key,第二个是删除的value.


d = {'a': 1, 'b': 2, 'c': 3}
print('删除之前:', d)
result = d.popitem()
print('result = ', result)
print('删除之后 ', d)

控制台打印:
删除之前: {'a': 1, 'b': 2, 'c': 3}
result =  ('c', 3)
删除之后  {'a': 1, 'b': 2}

方式三:pop

根据key删除字典中的key-value,会将被删除的value返回!
如果删除不存在的key,会抛出异常
如果指定了默认值,再删除不存在的key时,不会报错,而是直接返回默认值

d = {'a': 1, 'b': 2, 'c': 3}
print('删除之前:', d)
result = d.pop('a')
print(result)  # 将key为a 的键值对删除
result = d.pop('z','这是默认值')  
print(result)   # 删除的key不存在时,会返回默认值
print('删除之后 ', d)

控制台打印:
删除之前: {'a': 1, 'b': 2, 'c': 3}
1
这是默认值
删除之后  {'b': 2, 'c': 3}

方式四:clear()用来清空字典

d = {'a': 1, 'b': 2, 'c': 3}
print('删除之前:', d)
d.clear()
print('删除之后 ', d)

控制台打印:
删除之前: {'a': 1, 'b': 2, 'c': 3}
删除之后  {}

八、字典浅拷贝copy()

该方法用于对字典进行浅复制
复制以后的对象,和原对象是独立,修改一个不会影响另一个
注意,浅复制会简单复制对象内部的值,如果值也是一个可变对象,这个可变对象不会被复制。

d = {'a': 1, 'b': 2, 'c': 3}
d2 = d.copy()
print('d = ', d, id(d))
print('d2 = ', d2, id(d2))

控制台:
d =  {'a': 1, 'b': 2, 'c': 3} 140363404990576
d2 =  {'a': 1, 'b': 2, 'c': 3} 140363404990936

# 修改复制之后的字典,不会影响被复制字典

d = {'a': 1, 'b': 2, 'c': 3}
d2 = d.copy()
d2['a'] = 100
print('d = ', d)
print('d2 = ', d2)

控制台打印:
d =  {'a': 1, 'b': 2, 'c': 3}
d2 =  {'a': 100, 'b': 2, 'c': 3}

赋值、浅拷贝、和深拷贝的区别:

b = a: 赋值引用,a 和 b 都指向同一个对象。
b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。


import copy

a = [1, 2, 3, 4, ['a', 'b']]  # 原始对象

b = a  # 赋值,传对象的引用
c = copy.copy(a)  # 对象拷贝,浅拷贝
d = copy.deepcopy(a)  # 对象拷贝,深拷贝

a.append(5)  # 修改对象a
a[4].append('c')  # 修改对象a中的['a', 'b']数组对象

print('a = ', a)  # a =  [1, 2, 3, 4, ['a', 'b', 'c'], 5]
print('b = ', b)  # b =  [1, 2, 3, 4, ['a', 'b', 'c'], 5]
# c浅拷贝a , 所以子对象还是还是会拷贝过来
print('c = ', c)  # c =  [1, 2, 3, 4, ['a', 'b', 'c']]   
print('d = ', d)  # d =  [1, 2, 3, 4, ['a', 'b']]

九、遍历字典

1、通过遍历keys()来获取所有的键

d = {'a': {'name': '孙悟空', 'age': 18}, 'b': 2, 'c': 3}
for k in d.keys():
    print(k)
a
b
c

2、通过values()该方法会返回一个序列,序列中保存有字典的左右的值

d = {'a': {'name': '孙悟空', 'age': 18}, 'b': 2, 'c': 3}
for v in d.values():
    print(v)
控制台打印:
{'name': '孙悟空', 'age': 18}
2
3

3、items():该方法会返回字典中所有的项,它会返回一个序列,序列中包含有双值子序列,双值分别是,字典中的key和value。

d = {'a': {'name': '孙悟空', 'age': 18}, 'b': 2, 'c': 3}
for k, v in d.items():
    print(k , '=' , v)

控制台打印:
a = {'name': '孙悟空', 'age': 18}
b = 2
c = 3
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值