实验要求:
编写函数,实现“字典加法”。输入时两个字典,返回值是相加后得到的新字典:
- 对于两个字典中都存在的key,把它们的value相加作为结果。其中,均为数字类型的,为算数相加;有一个为字符串类型的,且另一个为数字或字符串时,则把第二个value拼接到第一个value后面,如果有一个是布尔类型,则结果为两个值的and运算。
- 对于只有一个字典中存在的key,直接把该键值对追加到结果字典中。
- 输入字典的value类型,只考虑数字、字符串、布尔值。
设计思路及实现:
1.取得两个字典的所有key值:
对于两个集合的key值,我们要考虑相同或不同的情况,采用集合的并集获取所有key的集合并逐一取出重新赋值:
for key in set(dic_1.keys()) | set(dic_2.keys()):
value_1 = dic_1.get(key)
value_2 = dic_2.get(key)
2.进行字典的加法
按照实验要求,对于不同的情况有不同的要求,按照if-else的结构进行构建,首先讨论key值不同的情况,即对应value为None,则将不为None的键值对放入新字典,然后处理key相同的情况,这里可以合并成四种情况:
for key in set(dic_1.keys()) | set(dic_2.keys()):
value_1 = dic_1.get(key)
value_2 = dic_2.get(key)
if value_1==None:
new_dic[key]=dic_2[key]
elif value_2==None:
new_dic[key]=dic_1[key]
else:
if isinstance(value_1,(int,float)) and isinstance(value_2,(int,float)):
new_dic[key]=value_1+value_2
elif isinstance(value_1,bool) or isinstance(value_2,bool) :
new_dic[key]=bool(value_1) and bool(value_2)
elif isinstance(value_1,str) and ( isinstance(value_2,str) or isinstance(value_2,(int,float)) ):
new_dic[key]=str(value_1)+str(value_2)
else:
new_dic[key]=str(value_1)+str(value_2)
3.调用函数
构造两个字典并调用函数进行处理(此处的测试涵盖了所有可能的类型):
dic_1 = {"a": 2, "b": "hello", "c": True,"d":3,"f":False,"h":5,"m":True}
dic_2 = {"a": "world", "b": "and", "c": "Python","d":88,"f":6,"g":"no"}
result = dictionary_addition(dic_1, dic_2)
print(result)
程序测试:
输出结果经对照完全正确:
{'a': '2world', 'g': 'no', 'f': 6, 'h': 5, 'c': True, 'd': 91, 'm': True, 'b': 'helloand'}
总结分析:
此次实验总体比较简单,但中间遇到了非常多的问题,但也让我加深了对python的理解,总结如下:
1.最开始的时候采取了分类讨论的思想,先对key进行交集操作,导致了如下问题:
- 未考虑到key的交集及其对应的补集为空的情况,此时空集不支持切片操作
- 考虑到后设置条件限制,但判断含布尔值、数字、字符串的集合是否为空的条件不好建立
- 判断分支结构复杂,应当想到正难则反
2.建立判断含布尔值、数字、字符串的集合是否为空的条件是采用len()函数是否为零的方法,但报错如下:
len(not(set(dic_1.keys()) | set(dic_2.keys())))==0
ERROE:object of type 'bool' has no len()
此处可能是交集写成了并集的原因,但报错显示布尔值不能成为len()函数操作对象(我理解是这样),但经时间len()函数可以计算含布尔值集合的长度,这个问题暂未解决,考虑是代码复杂某些别的局部导致的问题。
3.对于并集情况下key不同的情况,value有一个应该为None,在未设置判断条件的情况下,None作为字符串的情况进入了下面的条件判断,未能及时发现其被处理的地方。学习了更细致的python程序调试方法,设置断点后逐步观察程序运行情况与变量变化,最终解决了问题。
4.对于数字与布尔值进行and运算,统一使用bool()转化后进行and运算,最后输出结果为数字而非Ture。经学习后明白:逻辑 and运算从左到右计算,返回的是最后一个被评估的操作数的值。
评论(0)