当前位置: 首页 > news >正文

list循环添加数据_深入学习python小练习(列表、字典、循环、判断)

练习案例

下面通过一个简化的虚拟案例做一次深入学习python小练习,有某果园销售数据如下:

sell_list = [    {'客户': '张三', '种类': '苹果','数量':100},    {'客户': '李四', '种类': '苹果','数量':200},    {'客户': '李四', '种类': '香梨','数量':200},    {'客户': '李四', '种类': '香梨','数量':300},    {'客户': '张三', '种类': '苹果','数量':100},    {'客户': '王五', '种类': '香蕉','数量':500},    {'客户': '王五', '种类': '香蕉','数量':150},    {'客户': '王五', '种类': '香蕉','数量':150},    {'客户': '王五', '种类': '苹果','数量':500},    {'客户': '赵六', '种类': '葡萄','数量':300},    {'客户': '李四', '种类': '葡萄','数量':300},    {'客户': '赵六', '种类': '苹果','数量':300},]

客户希望对数据进行整理,期待得到的数据集格式类似如下这样:

result_list = [    ['张三', {'苹果': 300, '香蕉': 200, }],    ['李四', {'苹果': 100, '香蕉': 200, }],    ['王五', {'苹果': 100, '香蕉': 200, }],]
bffaea8f83bb71d687a6904142a83a8b.png

果园销售数据汇总

需求分析

客户原始数据池是列表,列表元素是客户、果名、数量。现在的需求是对列表元素进行汇总,得出客户、果名、数量的汇总表。

首先遍历原始数据池,判断客户名

  • 若在数据集中客户名不存在,则数据集中添加客户名,同时将果名和数量以字典格式加入数据集。
  • 若在数据集中客户名存在,则判断果名:若在数据集中果名存在,则将数量累加。若在数据集中果名不存在,则添加果名和数量。

通过以上分析有个大致的框架,通过2层嵌套循环加判断来编写代码。

d5145c1f71bf7a9fecacc2ddfa1aa225.png

写代码之前先进行需求分析,理清思路

具体代码

我设想的代码有2种方案:

  1. 二层循环嵌套if的列表实现方式,优点是较省内存,缺点是速度略慢:
result_list = []for i in sell_list:    for j in result_list:        if j[0] == i['客户']:            if i['种类'] not in j[1]:                j[1][i['种类']] = i['数量']            else:                j[1][i['种类']] = j[1][i['种类']] + i['数量']            break    else:        result_list.append([i['客户'], {i['种类']: i['数量'], }])for i in result_list:    print(i)out:['张三', {'苹果': 200}]['李四', {'苹果': 200, '香梨': 500, '葡萄': 300}]['王五', {'香蕉': 800, '苹果': 500}]['赵六', {'葡萄': 300, '苹果': 300}]

上述代码有一个需要特别注意的地方,循环体内break会跳过整个循环体(含循环体的else部分)。这一点很多教材都没有讲得很透彻。

  1. 单层循环嵌套if的字段实现方式,优点是速度较快,缺点是较费内存:
result_dict = {}for i in sell_list:    if i['客户'] in result_dict:        if i['种类'] not in result_dict[i['客户']]:            result_dict[i['客户']][i['种类']] = i['数量']        else:            result_dict[i['客户']][i['种类']] += i['数量']    else:        result_dict[i['客户']] = {i['种类']: i['数量']}for i, j in result_dict.items():    print(i, j)out:张三 {'苹果': 200}李四 {'苹果': 200, '香梨': 500, '葡萄': 300}王五 {'香蕉': 800, '苹果': 500}赵六 {'葡萄': 300, '苹果': 300}

在字典实现方式中看起来是比列表实现方式少了一层循环,实质上这个循环的目的在“if i['种类'] not in result_dict[i['客户']]:”这个部分已经实现了,在容器中找成员,字典是速度最快同时也是最费内存的方式。

2463d9f1f261d4279a1ede22ec246e28.png

根据需求分析,尝试多种代码实现方式,并比较优劣。

相关文章:

  • torch.rand()四个参数什么意思_CNC操作面板讲解,看看这些按键是什么意思
  • python手把手入门教程 pdf-零基础学Minecraft编程(图文版) 中文pdf完整版[41MB]
  • list、set、map 之间的区别是什么?_不同类型增压缸之间有什么区别?
  • 正元工程资料管理免安装_机电安装工程怎样进行分包?有什么申请资料?
  • postman 怎么调试pos_详细全面的postman接口测试实战教程
  • python 程序运行时间_python怎么加注释
  • iphone导出照片到电脑_如何将 Live Photo 以静态图片导出到电脑?
  • pycharm中文字体用什么好_实木家具erp用什么好
  • c语言prime函数怎么用_用一个自动关机小程序小试牛刀,玩转C语言System函数,边学边玩...
  • 红黑树的红黑有什么意义_蔡徐坤很优秀,很有礼貌,希望黑他的人可以越来越少...
  • java 代码过长_这份Java程序员珍藏书单,我交出来了!
  • logback不输出至文件_spring-boot-route(十六)使用logback生产日志文件
  • 返回1到n的所有组合python_python生成n个元素的全组合方法
  • python代码打包_Python学习笔记(一):Python代码的打包与发布
  • jad反编译工具_推荐一款阿里开源的 Java 诊断工具,好用到爆!
  • [LeetCode] Wiggle Sort
  • 【笔记】你不知道的JS读书笔记——Promise
  • Java小白进阶笔记(3)-初级面向对象
  • jquery ajax学习笔记
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Redux系列x:源码分析
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 阿里云购买磁盘后挂载
  • 测试开发系类之接口自动化测试
  • 程序员最讨厌的9句话,你可有补充?
  • 从setTimeout-setInterval看JS线程
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 积累各种好的链接
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #{}和${}的区别是什么 -- java面试
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (全注解开发)学习Spring-MVC的第三天
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)http协议
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • @Autowired和@Resource的区别
  • @synthesize和@dynamic分别有什么作用?
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [].slice.call()将类数组转化为真正的数组
  • [Android 13]Input系列--获取触摸窗口
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [C++打怪升级]--学习总目录
  • [codevs] 1029 遍历问题
  • [CSS]盒子模型
  • [c语言]小课堂 day2