一些关于自己学习Python的经历的内容,遇到的问题和思考等,方便以后查询和复习。
声明:本人学习是在扇贝编程通过网络学习的,相关的知识、案例来源于扇贝编程。如果使用请说明来源。
第24关,字典进阶
练习:成绩与评语
编程考试成绩出来了,我们根据每个人的成绩说一句话。如果分数大于 90,打印 xxx 考得很好继续保持;如果分数在 80-90 之间,打印 xxx 考得不错继续加油;如果分数小于等于 80,打印 xxx 考得不行下次努力(xxx为对应的人名)。
提示:用 for 循环 和items() 方法遍历字典。
scores = {
'林黛玉': 95,
'薛宝钗': 93,
'贾宝玉': 78,
'袭人': 85
}
print(list(scores.items()))
for name, score in scores.items():
ifscore > 90:
print(name + '考得很好继续保持')
elif 80 < score <=90:
print(name + '可得不错继续加油')
else:
print(name + '考得不行下次努力')
答案:
答案中直接用大于90,大于80,和其他。中间没有用80到90,因为第一段是90以上,第二段是80以上,也就是80到90的范围了。
练习:城市温度
下面给出了国内几个城市的气温,请你用访问嵌套字典的方式将 南京 的气温打印出来。
temperatures = {
'中国': {
'江苏': {
'南京': '32度',
'苏州': '31度'
},
'四川': {
'成都': '37度',
'绵阳': '34度',
},
'广东': {
'深圳': '30度',
'广州': '33度'
}
}
}
print(temperatures['中国']['江苏']['南京'])
练习:城市温度
如何将上一关中的存储气温的数据改造成格式统一,更加清晰的结构。
改完后再通过学过的循环和字典的知识打印出如下内容:
江苏-南京的温度是32度
江苏-苏州的温度是31度
四川-成都的温度是37度
四川-绵阳的温度是34度
广东-深圳的温度是30度
广东-广州的温度是33度
提示:将你的答案和参考答案对比一下,看看能否有所收获!
temperatures = [
{
{
shengfen:'江苏',
chengshi:'南京',
wendu: '32度'},
{
shengfen:'江苏',
chengshi:'苏州',
wendu: '31度'}
},
{
{
shengfen:'四川',
chengshi:'成都',
wendu: '37度'},
{
shengfen:'四川',
chengshi:'绵阳',
wendu: '34度'}
},
{
{
shengfen:'广东',
chengshi:'深圳',
wendu: '3度'},
{
shengfen:'广东',
chengshi:'广州',
wendu: '33度'}
}
]
for i intemperatures:
print('%s-%s的温度是%s' %(i['shengfen'], i['chegnshi'], i['wendu'])
('%s' + '-' + '%s' + '的温度是' + %s %
(i['shengfen'], i['chegnshi'], i['wendu'])
最后这句如何改,都是报错,总说有问题。后来发现是最后一行最后少半个括号
再细看看for循环一句,很难进行访问。我是整个信息改成一个列表,列表里面是字典套字典,此时如何访问呢?
看了前面的例子,我修改了程序:
emperatures = [
{
provinces:'江苏',
city:'南京',
temperature: '32度'
},{
shengfen:'江苏',
chengshi:'苏州',
wendu: '31度'
},{
shengfen:'四川',
chengshi:'成都',
wendu: '37度'
},{
shengfen:'四川',
chengshi:'绵阳',
wendu: '34度'
},{
shengfen:'广东',
chengshi:'深圳',
wendu: '3度'
},{
shengfen:'广东',
chengshi:'广州',
wendu: '33度'
}
]
for i intemperatures:
print('%s-%s的温度是%s' %(i['shengfen'], i['chegnshi'], i['wendu']))
这样整个程序显得更为简洁,在一个列表中,里面的元素是字典。但是总是说第一行的变量province没有定义,我原来用的拼音shengfen,程序也说没有定义。
前面的例子中也没有进行事先的定义啊?
scores = [
{
'shengfen':'江苏',
'chengshi':'南京',
'wendu': '32度'
},{
'shengfen':'江苏',
'chengshi':'苏州',
'wendu': '31度'
},{
'shengfen':'四川',
'chengshi':'成都',
'wendu': '37度'
},{
'shengfen':'四川',
'chengshi':'绵阳',
'wendu': '34度'
},{
'shengfen':'广东',
'chengshi':'深圳',
'wendu': '3度'
},{
'shengfen':'广东',
'chengshi':'广州',
'wendu': '33度'
}
]
# 用 for 循环遍历
for i in scores:
print('%s-%s的温度是%s' %(i['shengfen'], i['chengshi'], i['wendu']))
再仔细看前面的例子,原来在字典中,键都是字符串,是要用英文单引号引起来的。于是我加上单引号之后,就可以打印出要求的结果。不过我把中国这个信息给丢掉了。
加上国家:
temperatures = [
{
'shengfen':'江苏',
'chengshi':'南京',
'wendu': '32度',
'guojia':'中国'
},{
'shengfen':'江苏',
'chengshi':'苏州',
'wendu': '31度',
'guojia':'中国'
},{
'shengfen':'四川',
'chengshi':'成都',
'wendu': '37度',
'guojia':'中国'
},{
'shengfen':'四川',
'chengshi':'绵阳',
'wendu': '34度',
'guojia':'中国'
},{
'shengfen':'广东',
'chengshi':'深圳',
'wendu': '3度',
'guojia':'中国'
},{
'shengfen':'广东',
'chengshi':'广州',
'wendu': '33度',
'guojia':'中国'
}
]
# 用 for 循环遍历
for i in temperatures:
print('%s-%s的温度是%s' %(i['shengfen'], i['chengshi'], i['wendu']))
收获:
1 字典中的键是字符串,需要用英文单引号引起来
2 使用字典中的键,即可访问或返回相关的值。
答案:
temperatures = {
'country': '中国',
'provinces': [
{
'name': '江苏',
'cities': [
{
'name': '南京',
'temperature': '32度'
},{
'name': '苏州',
'temperature': '31度'
}
]
},{
'name': '四川',
'cities': [
{
'name': '成都',
'temperature': '37度'
},{
'name': '绵阳',
'temperature': '34度'
}
]
},{
'name': '广东',
'cities': [
{
'name': '深圳',
'temperature': '30度'
},{
'name': '广州',
'temperature': '33度'
} #这里居然可以随便缩进几个都无所谓,只要和前面能够一一配套就可以。
]
}
]
}
# 用 for 循环遍历
for province intemperatures['provinces']:
for city in province['cities']:
print('{}-{}的温度是{}'.format(province['name'],city['name'], city['temperature']))
答案的思路是,中国、省份、城市,具体城市和温度。
这几天由于在上网课学习微课制作,今天重新复习一下,把这个重新写到网站上,结果把温度单词最后的re写成了er,结果就是出问题,老是报错。耗费半天时间才发现问题在哪里
试验之后发现:最后两行的city和province对应改成a和b也是可以的。
另外:列表或者字典后面的方括号和大括号缩进几个空格无所谓。只是前后对应层次比较清楚。
练习:统计骰子每个点数初选的概率
大家肯定都摇过🎲,我们知道一个骰子有六个面,分别对应 1-6 六个数字,这六个数字出现的概率是一样的,都是六分之一(0.166666...)。
接下来我们来用 Python 验证一下,我们摇 1000 次骰子并统计每个数字出现的次数,然后将每个数字出现的次数除以总次数得出每个数字出现的概率。
Tips:使用 random.choice() 来模拟摇骰子。
mport random
count ={"1": 0, "2": 0, "3": 0, "4": 0,"5": 0, "6": 0}
choice = ['1','2', '3', '4', '5', '6']
result =random.choice()
if result incount:
count(result) = count(result) + 1
else:
count(result) = 1 #可以不需要这个,随机生成数字之后,其对应的值加1即可。
returncount(result)
for i in count:
print('%s的概率是:%d/1000'%(count[i], count[count(result)]))
SyntaxError: can't assign to function call on line 7
import random
count ={"1": 0, "2": 0, "3": 0, "4": 0,"5": 0, "6": 0}
#print(list(count.keys())) 打印字典键的列表
for i in range(0,1000):
a = random.choice(list(count.keys())) #在键列表中随机选一个
# print(list(count.items())) 打印键列表
print(a) 打印选出的数字
print(count[a]) 打印选出的数字(键)对应的值
count[a] += 1 选出的键对应的值加1
#print(a) 打印选出的数字
#print(count[num]) 打印选出数字(键)对应的值。这里num可以改为a
#print(count.items()) 打印字典里列表,前面会有dict_items
print(list(count.items())) 打印转化为列表之后的字典里的内容
# for num, countsin count.items(): 如果num和counts在字典count里面
# print('数字{}的概率为{}'.format(num, counts/1000)) 打印每个数字及其概率
最后这里两句中num,counts和前面并不对应,没有出现过,这个没有关系,主要是用来调用字典中键及其值的,这两句统一即可,不用和前面统一。
学习笔记:
keys() 用于获取字典中所有的 键。
scores = {
'林黛玉': 95,
'薛宝钗': 93,
'贾宝玉': 78,
'袭人': 85
}
print(scores.keys())
# 输出:dict_keys(['林黛玉', '薛宝钗', '贾宝玉', '袭人'])
values() 用于获取字典中所有的 值。
print(scores.values())
# 输出:[95, 93, 78, 85]
items() 用于获取字典中所有的 键 + 值 元组。
print(scores.items())
# 输出:[('林黛玉', 95), ('薛宝钗',
93), ('贾宝玉', 78), ('袭人', 85)]
# 使用循环遍历字典的键和值
forname, score in scores.items():
print('%s的分数是:%d' %(name, score))
name和score可以改成a和b,第二句中的也改成a和b也可以,只是可读性差了点。
注意:keys()、values() 和 items() 方法在 Python3 中返回的是有序序列,必要时需要用 list() 函数转换成列表使用,如 list(scores.keys())。
get() 通过 键 获取字典对应的值,当 键 不存在于字典当中时不会报错,而是默认返回 None,也可以通过第二个参数设置不存在时的默认返回值。
print(scores.get('林黛玉')) #输出:95
print(scores.get('小贝')) #输出:None
print(scores.get('小贝', '小贝没参加编程考试')) #输出:小贝没参加编程考试
字典嵌套
我们之前说过,字典的 键 是 唯一不可变的,而字典的 值 是没有限制的。所以,当字典的值为字典时,就形成了字典的嵌套。
scores = {
'编程一班': {
'林黛玉': 95,
'贾宝玉': 78
},
'编程二班': {
'薛宝钗': 93,
'袭人': 85
}
}
print(scores['编程一班'])
# 输出:{'林黛玉': 95, '贾宝玉':78}
print(scores['编程一班']['林黛玉'])
# 输出:95
scores = {
'扇贝编程': {
'编程一班': {
'林黛玉': 95,
'贾宝玉': 78
},
'编程二班': {
'薛宝钗': 93,
'袭人': 85
}
}
}
print(scores['扇贝编程']['编程一班']['林黛玉'])
# 输出:95
虽说只要符合字典的语法要求,随便怎么定义 键 和 值。但为了更方便的使用字典,一般字典只用于描述一个对象,字典里的键 用于描述对象的属性,当有多个对象时用列表存储。
字典和列表都是 Python 中很常用的数据类型,它们经常被混合着一起使用。比如:
names = {
'编程一班': ['林黛玉', '贾宝玉'],
'编程二班': ['薛宝钗', '袭人']
}
scores = [
{
'林黛玉': 95,
'贾宝玉': 78
}, {
'薛宝钗': 93,
'袭人': 85
}
]
# 不适合的例子
# scores = {
# '林黛玉': 95,
# '薛宝钗': 93,
# '贾宝玉': 78,
# '袭人': 85
# }
# 改进后的例子
scores = [
{
'name': '林黛玉',
'score': 95
}, {
'name': '薛宝钗',
'score': 93
}, {
'name': '贾宝玉',
'score': 78
}, {
'name': '袭人',
'score': 85
}
]
# 用 for 循环遍历
fori in scores: #由于用的是遍历,所以i可以改成任何字母
print('%s的分数是:%d' %(i['name'], i['score']))
# 输出:
# 林黛玉的分数是:95
虽然代码更长了,但却更加的清晰易懂。因为 键 表明了属性,所以我们一眼能看出 林黛玉 是人名,95 是分数。而且这种方式的扩展性更好,如果要再加一个班级的信息,只需添加一个 class 的 键,第一种则没有办法添加。
scores = [
{
'name': '林黛玉',
'class': '编程一班',
'score': 95
}, {
'name': '薛宝钗',
'class': '编程一班',
'score': 93
}, {
'name': '贾宝玉',
'class': '编程二班',
'score': 78
}, {
'name': '袭人',
'class': '编程二班',
'score': 85
}
]
字典中的键都要用英文单引号引起来