P

Python程序设计—字典加法

古月 2023-10-24

实验要求:

编写函数,实现“字典加法”。输入时两个字典,返回值是相加后得到的新字典:

  • 对于两个字典中都存在的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)

发布评论