Self-study Python Fish-C Note9 P37to39

字典

导入例子 (摩斯密码表)

使用列表实现

# 法1
## 摩斯密码表
c_table = ['._', '_...', '_._.', '_..', '.', '.._.', '__.', '....', '..', '.___', '_._', '._..', '__', '_.', '___', '.__.', '__._', '._.',
           '...', '_', '.._', '..._', '.__', '_.._', '_.__', '__..', '.____', '..___', '...__', '...._', '.....', '_....', '__...', '___..', '____.', '_____']

## 摩斯明文表
d_table = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
           'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0']

code = input('请输入摩斯密码: ')
split_code = code.split(' ')
result = [d_table[c_table.index(each)] for each in split_code] # 列表推导式
print(result)
请输入摩斯密码:  ._ _... _._.


['A', 'B', 'C']
# 法2
## 摩斯密码对比表
c_table = ['A', '._', 'B', '_...', 'C', '_._.', 'D', '_..', 'E', '.', 'F', '.._.', 'G', '__.', 'H', '....', 'I', '..', 'J', '.___', 'K', '_._', 'L', '._..',
           'M', '__', 'N', '_.', 'O', '___', 'P', '.__.', 'Q', '__._', 'R', '._.', 'S', '...', 'T', '_', 'U', '.._', 'V', '..._', 'W', '.__', 'X', '_.._',
           'Y', '_.__', 'Z', '__..', '1', '.____', '2', '..___', '3', '...__', '4', '...._', '5', '.....', '6', '_....', '7', '__...', '8', '___..', '9', '____.', '0', '_____']

code = input('请输入摩斯密码: ')
split_code = code.split(' ')
result = [c_table[c_table.index(each)-1] for each in split_code]
print(result)
请输入摩斯密码:  ._ _... _._.


['A', 'B', 'C']

使用字典实现
NB:在映射类型数据的获取上,字典的效率是远远快于列表的

dic = {'._': 'A', '_...': 'B', '_._.': 'C', '_..': 'D', '.': 'E', '.._.': 'F', '__.': 'G', '....': 'H', '..': 'I', '.___': 'J', '_._': 'K', '._..': 'L',
       '__': 'M', '_.': 'N', '___': 'O', '.__.': 'P', '__._': 'Q', '._.': 'R', '...': 'S', '_': 'T', '.._': 'U', '..._': 'V', '.__': 'W', '_.._': 'X',
       '_.__': 'Y', '__..': 'Z', '.____': '1', '..___': '2', '...__': '3', '...._': '4', '.....': '5', '_....': '6', '__...': '7', '___..': '8', 
       '____.': '9', '_____': '0'}

code = input('请输入摩斯密码: ')
split_code = code.split(' ')
result = [dic[each] for each in split_code]
print(result)
请输入摩斯密码:  ._ _... _._.


['A', 'B', 'C']

创建字典

例子:
比如定义字典 dic = {'A': '1', 'B': '2'} 这里有两对映射关系,: 左边为字典的键,右边为字典的值。
NB:
(1)与序列不同,序列是通过位置的偏移来存取数据的,而字典则是通过键来实现写入和读取。事实上在 python3.7 之前,字典内部的存储顺序是得不到保证的,所以不能通过下标来切片。
(2)与序列不同,在序列中元素是可以重复的。字典中的键值对(项),一个键就是对应一个值,不可以存在重复的键。重复了就会用新的值覆盖原来的值。
(3)区分集合的创建

dic = {'A': '1', 'B': '2'}
type(dic) # 这里是字典
dict
se = {'A', '1', 'B', '2'}
type(se) #这里是集合
set

(4) 字典的索引需要用键值

dic['A']
'1'

(5)我们可以通过指定一个不存在于字典中的键, 来创建一个新的键值对

dic['C'] = '3'
print(dic['C'])
3

(6)创建字典的方法 (官方文档里的6种)

# method 1: using {} and :
dic1 = {'A': '1', 'B': '2'}

# method 2: dic() function
dic2 = dict(A = '1', B = '2')
## 注意 dict 函数使用时,不可以给键加引号 dict('A' = '1', 'B' = '2') 会报错

# method 3: 使用列表作为参数,列表中的每一个元素是使用元组包裹起来的键值对
dic3 = dict([('A', '1'), ('B', '2')])

# method 4: 将法一作为参数传递给dict
dic4 = dict({'A': '1', 'B': '2'})

# method 5: 混合方法
dic5 = dict({'A': '1'}, B = '2')

# method 6: zip function
## zip 函数的作用是创建一个聚合多个可迭代对象的迭代器,可以将这个迭代器作为参数传递给 dic 函数
dic6 = dict(zip(['A', 'B'], ['1', '2']))

dic1 == dic2 == dic3 == dic4 == dic5 == dic6
True

字典的方法 (增删改查)

1. fromkeys(iterable[,values]) 方法

介绍: fromkeys(iterable[,values]) 可以使用 iterable 参数指定的可迭代对象来创建一个新的字典,并将所有的值初始化为 values 参数指定的值。
这种方法适用于从无到有,创建一个所有键的值都相同的字典,即快速初始化一个字典。

dic1 = dict.fromkeys('ABC', 0)
dic1
{'A': 0, 'B': 0, 'C': 0}

如果需要修改某个键的值:

dic1['A'] = 1
dic1
{'A': 1, 'B': 0, 'C': 0}
2. 通过指定一个不存在于字典中的键, 来创建一个新的键值对
dic1 = {'A': '1', 'B': '2'}
dic1['D'] = 4
print(dic1['D'])
4

1. pop(key[,default]) 方法

介绍:删除字典中指定的元素, 返回的是指定元素对应的值。
注意如果pop一个不存在的键就会抛出异常。可以通过 default 参数避免异常,返回给的 default 参数

dic1 = {'A': '1', 'B': '2'}
dic1.pop('A')
'1'
# default 参数
dic1 = {'A': '1', 'B': '2'}
dic1.pop('C', 'not exist')
'not exist'
2. popitem() 方法

介绍:在 python3.7 之前是随机删除一个键值对。在 python 3.7 之后是删除最后一个加入字典的键值对。返回删除的那个键值对。

dic1 = {'A': '1', 'B': '2'}
dic1['Z'] = 3
dic1.popitem()
('Z', 3)
dic1
{'A': '1', 'B': '2'}
3. del 语句
# 删除字典里的一个元素
dic1 = {'A': '1', 'B': '2', 'C': '3'}
del dic1['C']
dic1
{'A': '1', 'B': '2'}

del 也可以直接删掉整个字典 如: del dic1

4. clear() 方法

描述:清空字典里的内容

dic1 = {'A': '1', 'B': '2', 'C': '3'}
dic1.clear()
dic1 # 变成了一个空字典
{}

1. 指定键,修改对应值
dic1 = {'A': '1', 'B': '2'}
dic1['B'] = 3
dic1
{'A': '1', 'B': 3}
2. update([other])方法

描述:可以同时修改多个键值对,也可以直接传入另外一个字典,或者一个包含键值对的一个可迭代对象

dic1 = dic.fromkeys('abc')
dic1
{'a': None, 'b': None, 'c': None}
dic1.update({'a': '1', 'b': '2'})
dic1
{'a': '1', 'b': '2', 'c': None}
dic1.update({'a': '2', 'b': '3', 'e': '5'})
dic1
{'a': '2', 'b': '3', 'c': None, 'e': '5'}
dic1.update(a=3,e=6)
dic1
{'a': 3, 'b': '3', 'c': None, 'e': 6}

1. 指定键,返回对应值
dic1 = {'A': '1', 'B': '2'}
dic1['B'] 
'2'

但是如果指定一个不存在的键,就会报错 如 dic1['b']。 要避免这一点可以使用接下来的 get() 方法

2. get(key[,default]) 方法

描述:可以传入一个 default 参数,用来指定当找不到对应键时,返回的值

dic1 = {'A': '1', 'B': '2'}
dic1.get('C', 'not exist')
'not exist'
3. setdefault(key[,default]) 方法

描述:查找某个键是否存在于字典中,若存在返回该键对应的值,若不存在赋予一个新的值

dic1 = {'A': '1', 'B': '2'}
dic1.setdefault('B', '3') # 此时返回的是 B 键对应的值
'2'
dic1.setdefault('C', '3') # 此时返回 3, 并且字典发生更新加入了一个新的键值对
'3'
dic1
{'A': '1', 'B': '2', 'C': '3'}
4. items(), keys(), values() 方法

描述:分别用于获取字典的键值对,键,和值三者的视图对象
视图对象:视图对象是字典的动态视图,这就意味着当字典的内容发生改变的时候,视图对象的内容也会相应地跟着改变。

# 创建三个视图对象
d = dict.fromkeys('abcde', 1)
keys = d.keys() # 创建字典键的视图对象
velues = d.values() # 创建字典值的视图对象
items = d.items() # 创建字典的键值对的视图对象

print(keys)
print(velues)
print(items)
dict_keys(['a', 'b', 'c', 'd', 'e'])
dict_values([1, 1, 1, 1, 1])
dict_items([('a', 1), ('b', 1), ('c', 1), ('d', 1), ('e', 1)])

当字典的内容发生改变的时候,视图对象的内容也会相应地跟着改变。

d.pop('d')
print(keys)
print(velues)
print(items)
dict_keys(['a', 'b', 'c', 'e'])
dict_values([1, 1, 1, 1])
dict_items([('a', 1), ('b', 1), ('c', 1), ('e', 1)])
5. copy() 方法

描述:与序列相同,这里提供字典的浅拷贝

a = d.copy()
a
{'a': 1, 'b': 1, 'c': 1, 'e': 1}

字典的方法 (一些非字典的内置方法)

1. 内置函数 len() 来获取字典中键值对的数量
d2 = dict.fromkeys('abcde', 1)
len(d2)
5
2. innot in 判断某个键是否存在于字典中
'a' in d2
True
'f' not in d2
True
3. list() 将字典转化为列表

注意默认返回的是字典中所有的键构成的列表

list(d2) # 即 list(d2.keys)
['a', 'b', 'c', 'd', 'e']
# 返回 所有值 构成的列表
list(d2.values())
[1, 1, 1, 1, 1]
# 返回 所有键值对构成的列表
list(d2.items())
[('a', 1), ('b', 1), ('c', 1), ('d', 1), ('e', 1)]
4. iter() 函数

描述:将字典的键构成一个迭代器

a = iter(d2)
for i in a:
    print(i)
# iter(d2.values) OR iter(d2.items) 会报错:TypeError: 'builtin_function_or_method' object is not iterable
a
b
c
d
e
a = iter(d2.values())
b = iter(d2.items())
for i in a:
    print(i)

for i in b:
    print(i)
# iter(d2.values) OR iter(d2.items) 会报错:TypeError: 'builtin_function_or_method' object is not iterable 注意加括号
1
1
1
1
1
('a', 1)
('b', 1)
('c', 1)
('d', 1)
('e', 1)
5. reversed() 函数 (python 3.8 往上)

描述:对字典内部键值对进行逆向操作 (python 3.7 之前字典是无序的,不能使用)

d2 = {'a': 1, 'b': 2, 'c':3}
list(reversed(d2.keys())) # 返回的是迭代器
['c', 'b', 'a']
list(reversed(d2.values()))
[3, 2, 1]
list(reversed(d2.items()))
[('c', 3), ('b', 2), ('a', 1)]
6. 嵌套

字典也可以嵌套,比如某个键的值是另外一个字典

d2 = {'a': ['yes',2,3], 'b': 2, 'c': {'a':100, 'b': 2}} # 嵌套了a 对应一个列表,c 对应一个字典
d2
{'a': ['yes', 2, 3], 'b': 2, 'c': {'a': 100, 'b': 2}}
d2['c']['a']
100
d2['a'][0]
'yes'
7. 字典推导式

例1:键值调换

d2 = {'a': 1, 'b': 2, 'c':3}
print(d2.items())
d3 = {v:k for k,v in d2.items()}
d3
dict_items([('a', 1), ('b', 2), ('c', 3)])





{1: 'a', 2: 'b', 3: 'c'}
# 加一个条件
d3 = {v:k for k,v in d2.items() if v>1}
d3
{2: 'b', 3: 'c'}

例2: 求字符串编码值

d2 = {x:ord(x) for x in 'abcde'}
d2
{'a': 97, 'b': 98, 'c': 99, 'd': 100, 'e': 101}

例3:易错点

d2 = {x:y for x in [1,3,5] for y in [2,4,6]}
d2
{1: 6, 3: 6, 5: 6}
# 原因是两个 for 循环不是并列的,第一个x的循环为大循环,y的循环为小循环。相当于循环了9次,最后全被6覆盖
## 即:
for x in [1,3,5]:
    for y in [2,4,6]:
        print((x,y))
# 如果最后只到 4
d2 = {x:y for x in [1,3,5] for y in [2,4]}
d2
(1, 2)
(1, 4)
(1, 6)
(3, 2)
(3, 4)
(3, 6)
(5, 2)
(5, 4)
(5, 6)





{1: 4, 3: 4, 5: 4}



附言:
题目:Self-study Python Fish-C Note-9 P37-P39
本文为自学B站上鱼C的python课程随手做的笔记。一些概念和例子我个人为更好的理解做了些查询和补充
因本人水平有限,如有任何问题,欢迎大家批评指正!
原视频链接:https://www.bilibili.com/video/BV1c4411e77t?p=8
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值