返回顶部
首页 > 资讯 > 后端开发 > Python >Python 避免字典和元组的多重嵌套问题
  • 174
分享到

Python 避免字典和元组的多重嵌套问题

2024-04-02 19:04:59 174人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录一、字典、元组的多重嵌套二、嵌套结构重构为类一、字典、元组的多重嵌套 例 1:记录全班学生的成绩。 分析:定义一个 SimpleGradebook类, 学生名是字典self._g

一、字典、元组的多重嵌套

例 1:记录全班学生的成绩。

分析:定义一个 SimpleGradebook类,

学生名是字典self._grades的键,成绩是字典self._grades的值。

class SimpleGradebook():
    def __init__(self):
        self._grades = {}
    def add_student(self, name):
        self._grades[name] = []
    def report_grade(self, name, score):
        self._grades[name].append(score)
    def average_grade(self, name):
        grades = self._grades[name]
        return self._grades, sum(grades) / len(grades)
book = SimpleGradebook()
book.add_student('qinlu')
book.report_grade('qinlu', 99)
print(book.average_grade('qinlu'))
({'qinlu': [99]}, 99.0)

字典可能因为功能过多导致结果多重嵌套。

例 2:扩充 SimpleGradebook类,按科目保存成绩。

分析:定义一个 BySubjectGradebook类,字典by_subject嵌套在字典self._grades内。

学生名是字典self._grades的键,科目、成绩是self._grades的值。

科目是字典by_subject的键,成绩是字典by_subject的值。

class BySubjectGradebook():
    """
        report_grade(), average_grade()嵌套了两层的字典
    """
    def __init__(self):
        self._grades = {}
    def add_student(self, name):
        self._grades[name] = {}
    def report_grade(self, name, subject, score):
        by_subject = self._grades[name]
        grade_list = by_subject.setdefault(subject, [])
        grade_list.append(score)
    def average_grade(self, name):
        by_subject = self._grades[name]
        total, count = 0, 0
        for scores in by_subject.values():
            total += sum(scores)
            count += len(scores)
        return self._grades, total / count
book = BySubjectGradebook()
book.add_student('qinlu')
book.report_grade('qinlu', 'Math', 99)
book.report_grade('qinlu', 'Math', 88)
book.report_grade('qinlu', 'Computer', 90)
book.report_grade('qinlu', 'Computer', 80)
print(book.average_grade('qinlu'))
({'qinlu': {'Math': [99, 88], 'Computer': [90, 80]}}, 89.25)

例 3:需求变更,需记录每次成绩占总成绩的权重。(期中、期末考试所占的分量比随堂考大)

class WeightedGradebook():
    def __init__(self):
        self._grades = {}
    def add_student(self, name):
        self._grades[name] = {}
    def report_grade(self, name, subject, score, weight):
        by_subject = self._grades[name]
        grade_list = by_subject.setdefault(subject, [])
        grade_list.append(score, weight)
    def average_grade(self, name):
        by_subject = self._grades[name]
        score_sum, score_count = 0, 0
        for subject, scores in by_subject.items():
            subject_avg, total_weight = 0, 0
            for score, weight in scores:
                #...
        return score_sum / score_count

该代码出现字典、元组的多层嵌套,应拆解为类。多层嵌套的代码,很难维护。

二、嵌套结构重构为类

将下面的字典重构为类。

字典by_subject嵌套在字典self._students内。

{'qinlu': {'Math': [(99, 0.1), (88, 0.9)], 'Computer': [(90. 0.1), (80, 0.9)]}}

分析:

① Gradebook()类,学生名是字典self._students的键;科目、成绩、权重是self._grades的值。

② Student()类,科目是字典self._subjects的键;成绩、权重是self._subjects的值。

③ Subject()类,成绩是列表self._grades的第一位;权重是列表self._grades的第二位。

从最底层开始重构,即考试成绩。这么简单的信息,没必要写成类。

namedtuple()命名元组。

'''
学习中遇到问题没人解答?小编创建了一个python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程pdf电子书!
'''
from collections import namedtuple

Grade = namedtuple('Grade', ('score', 'weight'))

# 科目类,该类包含考试成绩
class Subject():
    def __init__(self):
        self._grades = []
    def report_grade(self, score, weight):
        self._grades.append(Grade(score, weight))
    def average_grade(self):
        total, total_weight = 0, 0
        # print(self._grades)
        for grade in self._grades:
            # print(grade)
            total += grade.score * grade.weight
            total_weight += grade.weight
        return total / total_weight

# 学生类,该类包含学习课程
class Student():
    def __init__(self):
        self._subjects = {}
    def subject(self, name):
        if name not in self._subjects:
            self._subjects[name] = Subject()
        return self._subjects[name]
    def average_grade(self):
        total, count = 0, 0
        for subject in self._subjects.values():
            total += subject.average_grade()
            count += 1
        return total / count

# 成绩册类,包含所有学生考试成绩的容器类,该容器类以学生名字为键,可动态添加学生
class Gradebook():
    def __init__(self):
        self._students = {}
    def student(self, name):
        if name not in self._students:
            self._students[name] = Student()
        return self._students[name]

book = Gradebook()
qin = book.student('qinlu')
math = qin.subject('Math')
math.report_grade(99, 0.1)
math.report_grade(88, 0.9)
print(qin.average_grade())
89.1

虽然代码量是原来的两倍,但更清晰,更易扩展,理解起来比原来容易。

到此这篇关于Python 避免字典和元组的多重嵌套的文章就介绍到这了,更多相关Python 多重嵌套内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python 避免字典和元组的多重嵌套问题

本文链接: https://lsjlt.com/news/119360.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python 避免字典和元组的多重嵌套问题
    目录一、字典、元组的多重嵌套二、嵌套结构重构为类一、字典、元组的多重嵌套 例 1:记录全班学生的成绩。 分析:定义一个 SimpleGradebook类, 学生名是字典self._g...
    99+
    2024-04-02
  • Python怎么避免字典和元组的多重嵌套
    本文小编为大家详细介绍“Python怎么避免字典和元组的多重嵌套”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python怎么避免字典和元组的多重嵌套”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、字典、元组...
    99+
    2023-07-02
  • python中字典和列表的相互嵌套问题详解
    目录1.列表中存储字典:1.列表中存储多个字典2.访问列表中字典的值3.遍历访问多个值2.字典中存储列表1.访问字典中的列表元素2.访问字典中的值(字典中的值为列表)3.字典中存储字...
    99+
    2024-04-02
  • 浅谈Python列表嵌套字典转化的问题
    在看视频教程的时候提到了[{'a' : 97}, {'b' : 98}, {'c' : 99}, {'d' : 100}, {'e' : 101}, ...........]形式的列...
    99+
    2024-04-02
  • python之如何查找多层嵌套字典的值
    目录python查找多层嵌套字典的值python字典的多层嵌套,如何快速定位到需要的数据另一种方法,下载一个jsonpath包$..key5总结python查找多层嵌套字典的值 de...
    99+
    2023-05-19
    python嵌套字典 python字典多层嵌套 多层嵌套字典
  • python元组和字典的介绍
    这篇文章主要介绍“python元组和字典的介绍”,在日常操作中,相信很多人在python元组和字典的介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python元组和字典的介绍”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-01
  • Python多维/嵌套字典数据无限遍历的实现
    最近拾回Django学习,实例练习中遇到了对多维字典类型数据的遍历操作问题,Google查询没有相关资料…毕竟是新手,到自己动手时发现并非想象中简单,颇有两次曲折才最终实现效果,将过程记录下来希望对大家有用...
    99+
    2022-06-04
    多维 遍历 嵌套
  • Android Fragment多层嵌套重影问题的解决方法
    1解决bug的思想: //step1:当bug被发现(排除极低偶然性,单次性,开发工具导致) //step2:根据经验判断bug的重现场景,多次测试,直到精准的定位bug //...
    99+
    2022-06-06
    android fragment 方法 fragment 嵌套 Android
  • python元组和字典的简单学习
    用圆括号()标识,定义元组后,元组元素不可修改。如果想修改元组只能重新定义元组。 因为元组不可更改,所以也没有增删改等用法,主要语法就是访问元组元素,遍历元组。 访问元组元素: 1 tuple1 = (1, 2, 3, 4) 2 pr...
    99+
    2023-01-30
    字典 简单 python
  • Python生成元组和字典的方法
    目录1.生成元组1.1使用()生成元组1.2使用tuple函数生成元组1.3使用divmod函数生成元组2.生成字典2.1使用{}生成字典2.2使用dict函数生成字典1.生成元组 ...
    99+
    2023-02-27
    Python生成元组 Python生成字典
  • Python实现嵌套列表及字典并按某一元素去重复功能示例
    本文实例讲述了Python实现嵌套列表及字典并按某一元素去重复功能。分享给大家供大家参考,具体如下: #! /usr/bin/env python #coding=utf-8 class HostSch...
    99+
    2022-06-04
    嵌套 示例 并按
  • 如何避免Java中的重定向和路径关键字问题?
    Java作为一门广泛使用的编程语言,其中有一些与重定向和路径相关的关键字问题。这些问题可能会在开发过程中引起一些困扰,但是通过一些简单的技巧,我们可以很容易地避免这些问题。在本文中,我们将详细介绍如何避免Java中的重定向和路径关键字问题。...
    99+
    2023-10-11
    重定向 关键字 path
  • Python元组和字典的知识点有哪些
    这篇文章主要介绍“Python元组和字典的知识点有哪些”,在日常操作中,相信很多人在Python元组和字典的知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python元组和字典的知识点有哪些”的疑...
    99+
    2023-06-27
  • Python HTTP文件重定向:如何处理和避免常见问题?
    在网络通信过程中,HTTP重定向是一个非常常见的操作。在HTTP请求中,服务器可能会将请求重定向到另一个URL,这时客户端需要重新发送请求到新的URL地址上。虽然HTTP重定向看起来很简单,但实际上它可能会引起一些问题。在本文中,我们将讨...
    99+
    2023-08-27
    http 文件 重定向
  • 重定向时如何避免PHP数组操作的阻塞问题?
    随着互联网的发展,网站的流量也越来越大,对于网站的性能要求也越来越高。PHP作为一种流行的服务器端脚本语言,它的性能也受到了广泛的关注。在PHP中,数组操作是一种常见的数据处理方式,但是在高并发的环境下,数组操作也会成为性能瓶颈之一。在重定...
    99+
    2023-10-30
    数组 异步编程 重定向
  • Java中的对象重定向和并发:如何避免问题?
    Java是一种面向对象的编程语言,其核心思想是将现实世界中的事物映射成为程序中的对象。在Java中,对象重定向和并发是两个常见的问题,如果不加以处理,就会出现一系列的问题。在本文中,我们将介绍Java中的对象重定向和并发,以及如何避免这些问...
    99+
    2023-10-15
    对象 重定向 并发
  • ASP和Linux的路径问题:如何避免关键字错误?
    在开发ASP网站或Linux应用程序时,路径问题是常见的错误之一。由于不同的操作系统和编程语言使用不同的路径分隔符和关键字,开发人员经常会遇到路径错误。这篇文章将介绍如何避免这些错误,并提供一些示例代码来帮助您更好地理解。 路径分隔符 ...
    99+
    2023-09-16
    linux path 关键字
  • 解决Python 遍历字典时删除元素报异常的问题
    错误的代码① d = {'a':1, 'b':0, 'c':1, 'd':0} for key, val in d.items(): del(d[k]) 错误的代码② -- 对于Python3...
    99+
    2022-06-04
    遍历 字典 元素
  • Python Django 开发中,如何避免存储相关的错误和问题?
    Python Django 是一款强大的开发框架,许多开发者都喜欢使用它。然而,在使用 Django 进行开发时,存储相关的错误和问题是难以避免的。这些错误和问题会严重影响应用程序的性能和稳定性。因此,本文将介绍如何在 Python Dja...
    99+
    2023-06-19
    django 开发技术 存储
  • Python开发注意事项:避免常见的并发和同步问题
    Python是一种流行的编程语言,被广泛应用于各种领域的开发。在Python开发中,经常会遇到并发和同步的问题。如果不正确处理这些问题,可能导致程序的不稳定性和性能下降。因此,本文将介绍一些注意事项,以避免常见的并发和同步问题。首先,了解并...
    99+
    2023-11-23
    开发 并发 关键词:Python 同步问题。
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作