Dict 字典
dict全称dictionary,在其他语言中也称为map,字典是另 一种可变容器模型,且可存储任意类型对象。具有极快的查找速度。
1. 创建字典
基本格式:d = {key1 : value1, key2 : value2 }
value: 我们要存储的数据
key: 找到数据的钥匙
# 创建一个空字典
dict0 = {}
print(dict0)
# 向空字典中加值
dict0['name'] = 'zhangsan'
print(dict0)
dict0['age'] = 18
print(dict0)
dict0.setdefault("Sex")
print(dict0)
dict0.setdefault("desciption", "nice girl")
print(dict0)
# 创建一个有数据得字典
dict1 = {"name": "zhangsan", "age": 18, "sex": "女", "desciption": "nice girl"}
print(dict1)
# 创建字典需要注意以下两点
# 1. 键唯一,多次出现会记住最后一个值, 前面得被覆盖
dict2 = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni', 'Name': 'Zhangsan'}
print(dict2)
print(dict2['Name'])
# 2. 键不可变,所以可以用数,字符串或元组充当,列表不行
# (1) 数字key
dic3 = {1: "a", 2: "b"}
print(dic3)
print(dic3[1])
# (2) 元组key
dic4 = {(1,2): "a", (3,4): "b"}
print(dic4)
print(dic4[(1,2)])
# (3) 列表key
dic5 = {['Name']: 'Zara', 'Age': 7}
print(dic5) # TypeError: unhashable type: 'list'
2. 访问字典
dict1 = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
# 方法一: []
name = dict1['Name']
age = dict1['Age']
print("学生姓名: {}, 学生年龄:{}".format(name, age))
# 取不存在的key
#sex = dict1['Sex'] # KeyError: 'sex'
# 方法二:get
name = dict1.get('Name')
age = dict1.get("Age")
print("学生姓名: {}, 学生年龄:{}".format(name, age))
# 取不存在的key,
sex = dict1.get("Sex")
print(sex)
# 设置取不存在key的默认值
sex = dict1.get("Sex", "未知")
print(sex)
print("学生姓名: {}, 学生年龄:{}, 学生性别:{}".format(name, age, sex))
3. 修改字典
dict1 = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
# 给Name的key重新赋值
dict1['Name'] = "Zhangsan"
print(dict1)
4. 删除字典
dict1 = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
# del 根据key删除
del dict1['Name']
print(dict1)
# pop方法删除
dict1.pop('Age')
print(dict1)
# clear方法清空字典
dict1.clear()
print(dict1)
# del 删除整个字典
del dict1
print(dict1) # NameError: name 'dict1' is not defined
5. 字典常用函数
len(dict):计算字典元素个数,即键的总数
dict1 = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print(len(dict1))
dict2 = {'Name': 'Zara', 'Age': 7, 'Class': ''}
print(len(dict2))
str(dict):输出字典可打印的字符串表示。
dict1 = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
str2 = str(dict1)
print(str2)
print(type(str2))
enumerate(dict) 枚举字典元素,返回枚举对象,其中每个元素为包含下标和值的元组
dict1 = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
for index, key in enumerate(dict1):
print("index: {}".format(index))
print("key: {}".format(key))
6. 字典常用方法
copy():返回一个字典复制
dict1 = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
dict2 = dict1.copy()
print(dict1)
print(dict2)
dict2['Name'] = "Zhangsan"
print(dict1)
print(dict2)
dict3 = {'Name': 'Zara', 'Age': 7, 'Class': 'First', 'score': [1,2,3,4]}
dict4 = dict3.copy()
dict4['score'] = [5,6,7,8]
print(dict3)
print(dict4)
fromkeys():创建一个新字典,以序列中元素做字典的键,val为字典所有键对应的初始值
new_d = ('Year', 'Month', 'Day')
dict1 = dict.fromkeys(new_d)
print("新的字典 : %s" % str(dict1))
dict1 = dict.fromkeys(new_d, 8)
print("新的字典 : %s" % str(dict1))
>> {'Year': None, 'Month': None, 'Day': None}
>> {'Year': 8, 'Month': 8, 'Day': 8}
items():以列表返回可遍历的(键, 值) 元组数组
dict1 = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
for k, v in dict1.items(): # 用items方法 k接收key ,v接收value
print(k, v)
keys():以列表返回一个字典所有的键
dict1 = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
for k in dict1.keys(): # 循环所有的values
print(k)
values():以列表返回字典中的所有值
dict1 = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
for v in dict1.values(): # 循环所有的values
print(v)
update(dict2):把字典dict2的键/值对更新到dict里
dict1 = {'Year': 2018, 'Month': 3, 'Day': 18}
# 第一种写法
dict1.update({'Year': 2019, 'Day': 20, 'Hour': 10})
# 第二种写法
dict1.update(Year=2019, Day=20, Hour=10)
# 已存在的key就覆盖,不存在的key就添加进字典
print(dict1)
>> {'Year': 2019, 'Month': 3, 'Day': 20, 'Hour': 10}
7. 字典排序
dict1={'a':2,'e':3,'f':8,'d':4}
# sorted()默认是对字典的键,从小到大进行排序
dict2 = sorted(dict1)
print(dict2)
>> ['a', 'd', 'e', 'f']
# 对键进行反向(从大到小)排序
dict2 = sorted(dict1,reverse=True)
print(dict2)
>> ['f', 'e', 'd', 'a']
# 先拿到所有的key,然后再对key排序
list1= sorted(dict1.keys(),reverse=True)
print(list1)
>> ['f', 'e', 'd', 'a']
# 对值排序 / 设值reverse=True 进行反向排序
list1= sorted(dict1.values())
print(list1)
>> [2, 3, 4, 8]
# 用dict1.items(),得到包含键,值的元组
# 对排序的规则进行了定义,x指元组,x[1]是值,x[0]是键
# 根据键进行排序
list1= sorted(dict1.items(),key=lambda x:x[0])
print(list1)
# 根据值进行排序
list1= sorted(dict1.items(),key=lambda x:x[1])
print(list1)
练习
- 把学生成绩名单(字典格式) 根据给定范围规则,输出学生是否及格,超出范围输出成绩不合法
规则范围:0 ~ 59:不及格,60 ~ 79:及格,80~100:优秀
示例:
student_score = {“张三” : 13, “李四”: 70}
输出: {“张三” : ”不及格“, “李四”: ”及格“}
student_score = {"小红": 60, "小绿": 79, "小黄": 23, "小蓝": 99, "小花": 10}
student_dict = {}
for name, score in student_score.items():
if score >= 0 and score <= 59:
result = "不及格"
elif score >= 60 and score <= 79:
result = "及格"
elif score >= 80 and score <= 100:
result = "优秀"
else:
result = "成绩不合法"
student_dict[name] = result
print(student_dict)
- 统计句子中重复的单词
题目要求:
- 重复的单词: 此处认为单词之间以空格为分隔符:
- 用户输入一句英文句子;
- 打印出每个单词及其重复的次数;
示例:
输入: “hello java hello python”
输出:
hello 2
java 1
python 1
language = input('请输入一句英文:')
#先按照空格分离字符串,成为列表
languages = language.split(' ')
#设置一个新的字典
words = {}
#遍历列表
for word in languages:
# 统计次数
count = languages.count(word)
words[word] = count
#key=单词,value=重复的次数,添加到字典中,字典中如果key值存在则更新value值,所以生成的字典中key不会重复。
#遍历打印字典
for word, count in words.items():
print('%s\t\t%s' %(word, count))
- 随机生成银行卡号
题目要求:
随机生成100个卡号;
卡号以6102009开头, 后面3位依次是 (001, 002, 003, 100),
生成关于银行卡号的字典, 默认每个卡号的初始密码为"redhat";
输出卡号和密码信息, 格式如下:
卡号 密码
6102009001 000000
提示:fromkeys()
#创建一个空列表
card_ids = []
card_start = "6102009"
#要求生成100个卡号所以循环100次
for i in range(100):
#指定前几位为6102009 后三位依次加1
s = card_start + str(i+1)
#添加元素
card_ids.append(s)
card_ids_dict = dict.fromkeys(card_ids,'redhat')
#将刚才生成的cards_ids作为key, value全为redhat
print('卡号\t\t\t\t\t密码')
#遍历字典
for card_id, password in card_ids_dict.items():
print('%s\t\t\t%s' %(card_id,password))