美文网首页
2020-07-18 Python学习笔记24 字典进阶

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

作者: 建渐升辉 | 来源:发表于2020-07-19 00:29 被阅读0次

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

相关文章

网友评论

      本文标题:2020-07-18 Python学习笔记24 字典进阶

      本文链接:https://www.haomeiwen.com/subject/ffhqkktx.html