2020-07-18 Python学习笔记24 字典进阶

一些关于自己学习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

  }

]

字典中的键都要用英文单引号引起来


第24关 字典进阶
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342