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

练习:合并列表中字典字段相同的值,第1张

练习:合并列表字典字段相同的值
  • 我的CSDN主页
  • My Python 学习个人备忘录
  • 我的博文推荐

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

      终于,今天被我磨出正果。
       目录
    1. 题目
    2. 解题遇阻
    3. “复制”正解
    4. 磨出正解
    5. 加多字典元素
    6. 对齐输出
    7. 完整代码

    练习题目


    回首页

    解题遇阻


    回首页

    “复制”正解代码

    说明:正解不可复制代码,截屏图片部分代码看不全。
    #
    #/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'nn原列表:n{line}n{oldlist}n{line}nnn合并字典字段相同元素后列表: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'nn原列表:n{line}n{oldlist}n{line}nnn合并字典字段相同元素后列表: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'nn原列表:n{line}n{oldlist}n{line}nnn合并字典字段相同元素后列表:n{line}n{newlist}n{line}n')
    

    回首页

    我的博文推荐:
    • 尼姆游戏(聪明版/傻瓜式•人机对战)(当前阅读3213)(代码优化版)
    • 练习:字符串统计(坑:f‘string‘报错)(当前阅读1183)
    • 练习:求列表(整数列表)平衡点(当前阅读1602)
    • 密码强度检测器(当前阅读1002)
    • (当前阅读1298)
    推荐条件 点阅破千

    参考文章:

    我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《一条语句定制输出(插值字符串格式化)》, 一起来围观吧

    上一篇: 一条语句定制输出
    下一篇: 


    回首页

    精品文章:

    • 正则表达式
    • 通过内置对象理解python
    • Python 完全自学手册
    • 海象运算符
    • Python中的 `!=`与`is not`不同
    • 学习编程的正确方法

    来源:老齐教室


    CSDN实用技巧博文:
    • 8个好用到爆的Python实用技巧

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zaji/5670757.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-12-16
    下一篇 2022-12-16

    发表评论

    登录后才能评论

    评论列表(0条)

    保存