函数习题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数习题相关的知识,希望对你有一定的参考价值。
#把一个字典扁平化
#源字典 {‘a‘:{‘b‘:1,‘c‘:2},‘d‘:{‘e‘:3,‘f‘:{‘g‘:4}}}
这个题的想法是最终要变成{‘ab‘:1,‘ac‘:2,‘de‘:3,‘def‘:4}这个样子的终字典,想的是能将字典的key值先遍历,最后将kv对重组能得到最后结果,我来试一试,额,初步试验之后的想法是不断选取key来拼接,直接到最后的key值为数值之后停止就可以了。
dic1={‘a‘:{‘b‘:1,‘c‘:2},‘d‘:{‘e‘:3,‘f‘:{‘g‘:4}}}
dic2={}
for k in dic1:
for i in dic1[k]:
if type(dic1[k][i])==int:
key=str(k)+str(i)
value=dic1[k][i]
dic2[key]=value
else:
for j in dic1[k][i]:
key=str(k)+str(i)+str(j)
value=dic1[k][i][j]
dic2[key]=value
dic2
这个能实现扁平化是完全按照一个普通的思想做出来的应该有简化的方法。还有一个问题就是这个只是一个普通的算法,实现函数的传参涉及解构的知识
def flat(dic1):
dic2={}
for k in dic1:
for i in dic1[k]:
if type(dic1[k][i])==int:
key=str(k)+str(i)
value=dic1[k][i]
dic2[key]=value
else:
for j in dic1[k][i]:
key=str(k)+str(i)+str(j)
value=dic1[k][i][j]
dic2[key]=value
return dic2
dic1={‘a‘:{‘b‘:1,‘c‘:2},‘d‘:{‘e‘:3,‘f‘:{‘g‘:4}}}
flat(dic1)
这样就是直接把参数传进来,其实这么做的话就已经有一点远离自己的优化思想了,如果在内部继续用这样的算法就有点愚蠢了。其实好像可以用for v in d.value(): v 来确定遍历value,来用一个循环让我们来实现它吧,我想了一个类似递归的循环。但是总感觉哪里不太对,这个题暂且隔起来,一会再来处理。
想出来一个好点的能实现递归的方法就是在每一次当中打一个标记,通过标记可以实现什么时候可以终止循环,之前想的是在遍历的过程中直接在原有的字典中进行修改,后来发现好像在遍历的过程中不能实现,就想着每一次能做一个空字典,把有用到的数据加进去,有一个不足的地方就是上次的数据利用不够如果每次都这来的话感觉效率一般。改进就先不想了,等着最后的答案吧,。
def flat(**dic1):
dic2={}
flag=True
for k,v in dic1.items():
if type(v)==int:
dic2[k]=v
else :
for k1,v1 in v.items():
newk=str(k)+str(k1)
dic2[newk]=v1
flag=False
return dic2 if flag else flat(**dic2)
dicx={‘a‘:{‘b‘:1,‘c‘:2},‘d‘:{‘e‘:3,‘f‘:{‘g‘:4}}}
flat(**dicx)
#实现Base64编码
看这个表其实感觉没那么难实现啊。用字典就可以了
def base64(n):
base={}
alpha=‘abcdefghijklmnopqrstuvwxyz‘
ALPHA=alpha.upper()
for i in range(64):
if i <26:
base[i]=ALPHA[i]
elif i<52:
base[i]=alpha[i-26]
elif i<62:
base[i]=(i-52)
elif i==62:
base[i]=‘+‘
else:
base[i]=‘/‘
return base[n]
base64(5)
改进的地方还是手打出来的字母表。
#求两个字符串的最长公共子串
想法就是一点一点的从头减一用find一个当子串资格当母串,通过这样遍历会找到最长子串,这是我看到这一道题的唯一一种解法,感觉要用两层循环,而且大概率会想到用while true‘来进行判断。没写之前想到一种优化的方法就是选择短的字符串作为子串,稍微长的作为母串这样会比较优化。不对,这样的想法得出的不是最长子串,想到了一个辣鸡方法就是遍历完,每次记录。这样会是最长的,先实现罢。
def longsub(a,b):
if a>b:
a,b=b,a
maxsub=‘‘
for i in range(len(a)):
for j in range(len(a)-i):
tmp=a[i:len(a)-j]
if b.find(tmp)>-1:
if len(tmp)>len(maxsub):
maxsub=tmp
return maxsub
a=‘abcdefghijklmnopqrstuvwxyz‘
b=‘ifhajijklmnopqrwrwr‘
longsub(a,b)
实现了,但是有一个问题就是如果最大子串相同话只能选取一个,解决方法我还想不出来,因为会把原来maxsub顶掉,如果用字典的话大多时候都用不到,暂且不管了。
以上是关于函数习题的主要内容,如果未能解决你的问题,请参考以下文章
笨办法学 Python(第三版)习题 18: 命名变量代码函数
笨办法学 Python(第三版)习题 18: 命名变量代码函数