练习:合并列表中字典字段相同的值

博主分享了在Python中如何使用operator模块高效地合并字典列表中字段相同的元素,同时避免修改原列表的技巧。通过复制操作和while循环,实现了合并过程中的字典累加,代码实例详细展示了整个解决方案。
摘要由CSDN通过智能技术生成


合并列表中字典字段相同的值


   昨天看到这个题目,感觉算法我会,简单。遍历列表,字典字段相同则合并(键位值累加),最后输出合并后的新列表。简单算法,用我自己的代码实现起来,就手足乱舞,很是不堪。最后勉强输出了题目要求,却也改变了原列表。以为我的代码错漏,全部抹除,“照搬”题目正解。run,我试着输出了原列表,发现也被更改。🧐我不想要这样子的结果!能不改变原列表实现输出符题?答案应该是肯定的。但昨晚,捣腾半夜,至寐不爽。🥴🥴

  终于,今天被我磨出正果。😀😀

   目录

  1. 题目
  2. 解题遇阻
  3. “复制”正解
  4. 磨出正解
  5. 加多字典元素
  6. 对齐输出
  7. 完整代码
  8. Operator模块

练习题目

在这里插入图片描述


回首页

解题遇阻

在这里插入图片描述


回首页

“复制”正解代码

在这里插入图片描述

说明:正解不可复制代码,截屏图片部分代码看不全。
#
#/sur/bin/nve python
# coding: utf-8

import operator

def set_list(): #函数对列表操作,就是操作原列表,不用传参
    '''合并字典字段相同元素'''
    newlist.append(oldlist[0]) #追加老列表第一个元素到新列表
    for old in range(1, len(oldlist)):
        for new in newlist:
            if operator.eq(new.keys(), oldlist[old].keys()):
                for key in new.keys():
                    new[key] += oldlist[old][key]
                break
            elif operator.eq(new, newlist[-1]):
                newlist.append(oldlist[old])
                break

#main codes
oldlist = [
{'0-0': 0, '0-2': 0, '0-3': 1972},
{'3-3': 203, '3-2': 0, '3-1': 0, '3-0': 0},
{'0-0': 0, '0-2': 0, '0-3': 1450},
{'3-3': 203, '3-2': 0, '3-1': 0, '3-0': 0},
{'0-0': 0, '0-2': 0, '0-3': 1334},
            ]
newlist = [] #初始新列表为空
set_list() #调用自定义函数合并字典字段相同元素
line = '﹊'*21 #结果输出
print(f'\n\n原列表:\n{line}\n{oldlist}\n{line}\n\n\n合并字典字段相同元素后列表:\n{line}\n{newlist}\n{line}\n')

代码运行效果

在这里插入图片描述

  原列表已跟着更改,因为赋值操作的本就是原列表中的字典。


回首页

被我磨出的“完美”代码
#/sur/bin/nve python
# coding: utf-8

import operator #模块载入。

def set_list(): #函数对列表等可愿地更改的变量操作,可以认为是“全局变量”,直接操作就好。就是操作原列表,不用传参。
    '''合并字典字段相同元素'''
    temp = oldlist[:] #复制老列表。
    while temp!=[]: #老列表副本删空,停止循环。
        newlist.append(temp.pop().copy())
        for i in temp: #遍历老列表副本,元素变化中,已处理字典(列表元素)被不断删除。
            for j in newlist: #遍历新列表,元素增长中,不断加入已合并的字典。
                if operator.eq(i.keys(), j.keys()): #这是新学到operator模块装逼😁😁,完全可以直接i.keys()==j.keys()。
                    for key in j.keys(): #遍历新列表字典元素字段。
                        j[key] += i[key] #相同字段值累加。
                    temp.remove(i) #temp是列表要用列表删除方法代码。字典列表的方法纠结不清,浪费了我一些大好光阴。


#main codes
oldlist = [
{'0-0': 0, '0-2': 0, '0-3': 1972},
{'3-3': 203, '3-2': 0, '3-1': 0, '3-0': 0},
{'0-0': 0, '0-2': 0, '0-3': 1450},
{'3-3': 203, '3-2': 0, '3-1': 0, '3-0': 0},
{'0-0': 0, '0-2': 0, '0-3': 1334},
            ]
newlist = [] #初始化新列表为空。
set_list() #调用自定义函数合并字典字段相同元素
line = '﹊'*21 #结果输出之分割线变量
#一句式插值字符串格式化最后输出结果
print(f'\n\n原列表:\n{line}\n{oldlist}\n{line}\n\n\n合并字典字段相同元素后列表:\n{line}\n{newlist}\n{line}\n')

在这里插入图片描述

代码运行效果

在这里插入图片描述


回首页

  加多列表字典元素,一样“完美”。

在这里插入图片描述
在这里插入图片描述

   加多不同元素的字典,也是可以滴。

在这里插入图片描述

在这里插入图片描述


回首页

   把列表解析成插值字符串格式化的一个字符串,一个字典元素显示一行,优化显示。
oldlist = ''.join([f'{i}\n' for i in oldlist]) #把列表解析成插值字符串格式化的一个字符串,一个字典元素显示一行,优化显示。
newlist = ''.join([f'{i}\n' for i in newlist]) #把列表解析成插值字符串格式化的一个字符串,一个字典元素显示一行,优化显示。

代码运行效果

在这里插入图片描述

   这样子,就整齐多了。🤗🤗

python完整代码
(如果从语句注释不能清楚作用,请评论区留言指教和探讨。🤝)
#/sur/bin/nve python
# coding: utf-8

import operator #模块载入。

def set_list(): #函数对列表等可愿地更改的变量操作,可以认为是“全局变量”,直接操作就好。就是操作原列表,不用传参。
    '''合并字典字段相同元素'''
    temp = oldlist[:] #复制老列表。
    while temp!=[]: #老列表副本删空,停止循环。
        newlist.append(temp.pop().copy())
        for i in temp: #遍历老列表副本,元素变化中,已处理字典(列表元素)被不断删除。
            for j in newlist: #遍历新列表,元素增长中,不断加入已合并的字典。
                if operator.eq(i.keys(), j.keys()): #这是新学到operator模块装逼😁😁,完全可以直接i.keys()==j.keys()。
                    for key in j.keys(): #遍历新列表字典元素字段。
                        j[key] += i[key] #相同字段值累加。
                    temp.remove(i) #temp是列表要用列表删除方法代码。字典列表的方法纠结不清,浪费了我一些大好光阴。


#main codes
oldlist = [
{'0-0': 0, '0-2': 0, '0-3': 1972},
{'八爪章鱼': 285, '老男人': 0.3, '善良': 52},
{'a': 3, 'b': 5, 'c': 2, 'd': 9, 'e': 10},
{'八爪章鱼': 285, '老男人': 0.3, '善良': 52},
{'3-3': 203, '3-2': 0, '3-1': 0, '3-0': 0},
{'0-0': 0, '0-2': 0, '0-3': 1334},
{'a1': 3, 'b2': 5, 'c3': 2, 'd4': 9, 'e5': 10},
{'八爪章鱼': 285, '老男人': 0.3, '善良': 52},
{'a': 3, 'b': 5, 'c': 2, 'd': 9, 'e': 10},
{'0-0': 0, '0-2': 0, '0-3': 1450},
{'八爪章鱼': 285, '老男人': 0.3, '善良': 52},
{'3-3': 203, '3-2': 0, '3-1': 0, '3-0': 0},
{'八爪章鱼': 285, '老男人': 0.3, '善良': 52},
{'a1': 3, 'b2': 5, 'c3': 2, 'd4': 9, 'e5': 10}
            ]
newlist = [] #初始化新列表为空。
set_list() #调用自定义函数合并字典字段相同元素
oldlist = ''.join([f'{i}\n' for i in oldlist]) #把列表解析成插值字符串格式化的一个字符串,一个字典元素显示一行,优化显示。
newlist = ''.join([f'{i}\n' for i in newlist]) #把列表解析成插值字符串格式化的一个字符串,一个字典元素显示一行,优化显示。
line = '﹊'*21 #结果输出之分割线变量
#一句式插值字符串格式化最后输出结果
print(f'\n\n原列表:\n{line}\n{oldlist}\n{line}\n\n\n合并字典字段相同元素后列表:\n{line}\n{newlist}\n{line}\n')

operator模块

  我在代码中用了这条代码,其实完全可以直接来——“i.keys()==j.keys()”。还不是因为在刷题时学到了operator模块,要熟识,也就秀了。😋😋

if operator.eq(i.keys(), j.keys()): #这是新学到operator模块装逼😁😁,完全可以直接i.keys()==j.keys()。
下图是operator方法与常规做法比对。

在这里插入图片描述


回首页

我的博文推荐:

推荐条件 点阅破千

参考文章:


上一篇:一条语句定制输出
下一篇:解析模块方法名


回首页

老齐漫画头像

精品文章:

来源:老齐教室


CSDN实用技巧博文:


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值