跳至主要內容

7. Dictionary

Ryan原创...大约 8 分钟pythonpython编程教程

1. 如何构建一个电话薄

我们有以下联系人:

姓名手机号
李雷123456
韩梅梅132456
大卫154389
Mr.Liu131452
Bornforthis180595
Alexa131559

如何用以往学过的知识构建要给具有用户输入查询功能的电话薄

变量、数字型、列表、元组、字符串

程序运行效果:

  • 测试一:
Enter your search name: 李雷
The 李雷 phone number is: 123456
  • 测试二:
Enter your search name: Bornforthis
The 李雷 phone number is: 180595
code1
names = ['李雷', '韩梅梅', '大卫', 'Mr.Liu', 'Bornforthis', 'Alexa']
numbers = [123456, 132456, 154389, 131452, 180595, 121559]

name = input('Enter your search name: ')
position = names.index(name)
number = numbers[position]

print(f"The {name} phone number is: {number}")

2. 字典结构

  • 用花括号表示字典
  • 字典内每一项都有两个元素组成:key and value
    • {key: value, key: value}
  • 各项用逗号隔开
dictionary = {'李雷': 1234,'韩梅梅':3456,'马冬梅':7891}
print(dictionary['李雷'])

# output
1234

3. 字典结构 key & value

  • key 和 value 是一一对应,同一个键只能有一个对应的值;
  • 键的类型选的是不可变的,如元组;
  • value 的类型是任意的;
names = {'name': '李雷', 'number': 1234, True: 'bool', 2:'int'}
print(names)

# output
{'name': '李雷', 'number': 1234, True: 'bool', 2: 'int'}

4. 用字典 dict 函数创建字典

  • 方法一: 根据其他序列创建新建字典
message = [('lilei', 98), ('hanmeimei', 99)]
list_to_dict = dict(message)
print(list_to_dict)

# output
{'lilei': 98, 'hanmeimei': 99}


message = [['lilei', 98], ['hanmeimei', 99]]
list_to_dict = dict(message)
print(list_to_dict)

# output
{'lilei': 98, 'hanmeimei': 99}
  • 方法二:
d = dict(lilei=98, hanmeimei=99)
print(d)

# output
{'lilei': 98, 'hanmeimei': 99}

上面两种创建字典的方法,有什么优缺点?

上面方法一的方法,可以更好的适配字典的各种数据类型情况。why?——因为结构是列表里面放元组,而元组的 0 号为放 key, 1号位放 value 。所以,只要是不可变的数据类型都可以放在 0 号位。

反之方法二:第一个位置必须是’变量‘,不能是其他数据类型。如:

d1 = dict(lilei=98, hanmeimei=99)
d2 = dict('lilei'=98, 'hanmeimei'=99)

上面的第二行代码,看起来就很奇怪了,一共有两个值一个值是 lilei 另一个值 98 两个都是值, 可以用 98 赋值给另一个值吗?————显然是不行的。

我们的赋值是需要把一个值赋值给一个变量(有空间)。

所以,第二种方法虽然可以创建字典,但是对于字典 key 的各种情况并不能完全支持。

Output 时第二种的 key 只能得到字符串

5. 访问字典数据

5.1 中括号访问

  • 利用中括号加要查询的 key
grade = {'lilei':'98', 'hanmeimei':'99'}
print(grade['lilei'])

# output
98

5.2 访问字典键

  • 如果访问字典时输入不存在的 key 会怎么样:
dict1 = {1:'a', 2:'b', 3:'c'}
print(dict1[4])

# output
Traceback (most recent call last):
  File "C:\Users\Administrator\PycharmProjects\Coder\Python\code7.py", line 2, in <module>
    print(dict1[4])
KeyError: 4

显然,如果直接访问访问键不存在时,会报错,但是我们在实际情况中有时不希望找不到键就报错,那应该怎么办?

  • get()

当使用 get 方法时,需要提供一个键(key),方法会返回与该键关联的值。如果该键在字典中不存在,get 方法将返回 None,或者你可以指定一个默认值,如果键不存在,则返回这个默认值。

这是 get 方法的基本语法:

value = dictionary.get(key, default_value)

  • key:你想要检索的键。
  • default_value:(可选)如果键不存在时返回的值。如果未提供此参数,默认值为 None。

代码示例:

# 创建一个简单的字典
my_dict = {'name': 'Alice', 'age': 25}

# 使用 get 访问一个存在的键
print(my_dict.get('name'))  # 输出: Alice

# 使用 get 访问一个不存在的键,并提供默认值。
# 如果没有提供第二个参数,则返回 None
print(my_dict.get('gender', 'Not Specified'))  # 输出: Not Specified

# output
Alice
Not Specified

在第一个 get 调用中,我们访问了键 'name',它在字典中存在,因此返回了对应的值 'Alice'。在第二个调用中,我们试图访问键 'gender',它在字典中不存在,因此返回了我们指定的默认值 'Not Specified'。

5.2.1 如何区分两者的使用场景呢?

  • python 底层逻辑是基于 c/c ++ 语言实现的,直接使用 [] 只有一次转换,比使用 get.() 经过多次转换的执行时间更短

  • 在如电话薄查询时,不希望查找失败就报错

5.3 字典的操作

5.3.1 修改

字典修改或添加数据原则:有则改之,无则加勉「无则添加」

5fd0d927b22cd876b7cb996d4074f32

代码示例:

grade = {'李雷':'98', '韩梅梅':'99'}
print(grade)

grade['韩梅梅'] = 100 # key in grade
print(grade)

grade['马冬梅'] = '95' # key not in grade
print(grade)

# output
{'李雷': '98', '韩梅梅': '99'}
{'李雷': '98', '韩梅梅': 100}
{'李雷': '98', '韩梅梅': 100, '马冬梅': '95'}

5.3.2 删除

58b94750070db13f8faf3d50efe309e
# 1.
grade = {'李雷': '98', '韩梅梅': 100, '马冬梅': '95'}
del grade['李雷'] 
print(grade)

# output
{'韩梅梅': 100, '马冬梅': '95'}



# 2.
grade = {'李雷': '98', '韩梅梅': 100, '马冬梅': '95'}
del grade #
print(grade)

# output
Traceback (most recent call last):
  File "C:\Users\Administrator\PycharmProjects\Coder\Python\code7.py", line 48, in <module>
    print(grade)
NameError: name 'grade' is not defined



# 3.
grade = {'李雷': '98', '韩梅梅': 100, '马冬梅': '95'}
grade.clear()
print(grade)
# output
{}

5.3.3 获取列表的键和值

  • keys()
  • values()
  • items()
student = {'name': 'lilei', '成绩':'98', '实验班':'98', '实验班':'True'}
print(student)

# 获取所有的 key:
print(student.keys())
print(list(student.keys()))
# 获取所有的 value:
print(student.values())
print(list(student.values()))
# 同时获取 key 和 value:
print(student.items())
print(list(student.items()))

# output
{'name': 'lilei', '成绩': '98', '实验班': 'True'}
dict_keys(['name', '成绩', '实验班'])
['name', '成绩', '实验班']
dict_values(['lilei', '98', 'True'])
['lilei', '98', 'True']
dict_items([('name', 'lilei'), ('成绩', '98'), ('实验班', 'True')])
[('name', 'lilei'), ('成绩', '98'), ('实验班', 'True')]

5.3.4 判断字典中的元素

  • 默认情况
# 默认情况是判断 key 在字典中
dict1 = {'name':'lilei', 'age':19}
print('name' in dict1)
print('class' in dict1)

# output
True
False
  • 使用 keys 实现纯粹判断
# 也可以在后面加上 .values() 判断是否为字典中的值
dict1 = {'name':'lilei', 'age':19}
print(19 in dict1.values()) # True
  • 使用 values 实现纯粹判断
dict1 = {'name':'lilei', 'age':19}
print('name' in dict1.keys()) # True

5.3.5 字典的排序

  1. 以 key 排序
dict1 = {'a': 1, 'd':4, 'b':2, 'c': 3}
print(dict1)

sorted_dict = sorted(dict1.items()) # 默认升序排序
print(sorted_dict)
print(dict(sorted_dict))

# output
{'a': 1, 'd': 4, 'b': 2, 'c': 3}
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
{'a': 1, 'b': 2, 'c': 3, 'd': 4}


# 指定以 key 排序
dict1 = {'a': 2, 'd':0, 'b':1, 'c': 3}

sorted_dict = sorted(dict1.items(), key=lambda x: x[0]) # x[0] 代表为键
print(sorted_dict)

to_dict = dict(sorted_dict)
print(to_dict)

# output
{'a': 2, 'b': 1, 'c': 3, 'd': 0}
  1. 以 value 排序
dict1 = {'a': 2, 'd':0, 'b':1, 'c': 3}

sorted_dict = sorted(dict1.items(), key=lambda x: x[1]) # x[1] 代表为键值
print(sorted_dict)

to_dict = dict(sorted_dict)
print(to_dict)

# output
[('d', 0), ('b', 1), ('a', 2), ('c', 3)]
{'d': 0, 'b': 1, 'a': 2, 'c': 3}
  1. 降序排序

    1. reverse
    dict1 = {'a': 2, 'd':0, 'b':1, 'c': 3}
    sorted_dict1 = sorted(dict1.items(), key=lambda x: x[1], reverse = True)
    print(sorted_dict1)
    # output
    [('c', 3), ('a', 2), ('b', 1), ('d', 0)]
    
    1. [::-1]
    dict1 = {'a': 2, 'd':0, 'b':1, 'c': 3}
    sorted_dict2 = sorted(dict1.items(), key=lambda x: x[0])[::-1]
    print(sorted_dict2)
    # output
    [('d', 0), ('c', 3), ('b', 1), ('a', 2)]
    

5.4 字典的嵌套

嵌套: 将一系列的字典存储在列表中,或将列表作为储存在字典中。

  • 字典列表
  • 在字典中存储列表
  • 在字典中存储字典
  1. 字典构成列表
# 字典构成列表
student1 = {'name':'lilei', 'age':'18', 'grade':'98'}
student2 = {'name':'hanmeimei', 'age':'19', 'grade':'99'}
student3 = {'name':'lilei', 'age':'18', 'grade':'95'}

student = [student1, student2, student3]
print(student)

# output
{'name': 'lilei', 'age': '18', 'grade': '98'}, {'name': 'hanmeimei', 'age': '19', 'grade': '99'}, {'name': 'lilei', 'age': '18', 'grade': '95'}]
  1. 在字典中存储列表
favorite_class = {
    'lilei':['数学','英语'],
    'hanmeimei':['语文'],
    'madongmei':['计算机','物理','数学'],

}

print(favorite_class['lilei'])
print(favorite_class['lilei'][0])

# output
['数学', '英语']
数学
  1. 在字典中存储字典
# 用一个字典表示学生信息
student1 = {'name':'lilei', '成绩':'98', '实验班':True}


# 用一个字典表示全班学生信息
class1 = {
    'lilei':{'成绩':'98','实验班':True},
    'hanmeimei':{'成绩':'95','实验班':False}
}

print(class1['lilei'])
print(class1['lilei']['成绩'])
print(class1['hanmeimei']['实验班'])

# output
{'成绩': '98', '实验班': True}
98
False

6. 练习

题目 1

描述:给定一个字典,其中键是学生的名字,值是一个元组,包含学生的年龄和他们的成绩。编写一个函数,该函数返回按年龄从小到大排序的学生名单。

示例输入

students = {
    'Alice': (20, 85),
    'Bob': (22, 90),
    'Charlie': (21, 88)
}

示例输出

['Alice', 'Charlie', 'Bob']

题目 2

描述:给定一个字典,其中键是商品的名字,值是商品的价格。编写一个函数,计算字典中所有商品的平均价格,并返回低于平均价格的商品的名称列表。

示例输入

products = {
    'Apple': 3.5,
    'Banana': 2.0,
    'Cherry': 5.0,
    'Date': 4.0
}

示例输出

['Banana', 'Date']

题目 3

描述:给定两个字典,编写一个函数,将这两个字典合并成一个。如果同一个键在两个字典中都有,则它的值应为两个字典中的值相加。假设字典中的值都是整数。

示例输入

dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'b': 3, 'c': 4, 'd': 5}

示例输出

{'a': 1, 'b': 5, 'c': 7, 'd': 5}
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度