合并列表中字典字段相同的值
昨天看到这个题目,感觉算法我会,简单。遍历列表,字典字段相同则合并(键位值累加),最后输出合并后的新列表。简单算法,用我自己的代码实现起来,就手足乱舞,很是不堪。最后勉强输出了题目要求,却也改变了原列表。以为我的代码错漏,全部抹除,“照搬”题目正解。run,我试着输出了原列表,发现也被更改。🧐我不想要这样子的结果!能不改变原列表实现输出符题?答案应该是肯定的。但昨晚,捣腾半夜,至寐不爽。🥴🥴
终于,今天被我磨出正果。😀😀
目录
练习题目
解题遇阻
“复制”正解代码
说明:正解不可复制代码,截屏图片部分代码看不全。
#
#/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方法与常规做法比对。
我的博文推荐:
- 尼姆游戏(聪明版/傻瓜式•人机对战)(当前阅读3213)(代码优化版)
- 练习:字符串统计(坑:f‘string‘报错)(当前阅读1183)
- 练习:求列表(整数列表)平衡点(当前阅读1602)
- 密码强度检测器(当前阅读1002)
- (当前阅读1298)
推荐条件
点阅破千
参考文章:
![老齐漫画头像](https://i-blog.csdnimg.cn/blog_migrate/8cbf2c45d8b57205b31ef4963b3b9854.jpeg)
精品文章:
来源:老齐教室