函数习题
#把一個字典扁平化
#源字典 {'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}}
這個題的想法是最終要變成{'ab':1,'ac':2,'de':3,'def':4}這個樣子的終字典,想的是能將字典的key值先遍歷,最后將kv對重組能得到最后結(jié)果,我來試一試,額,初步試驗之后的想法是不斷選取key來拼接,直接到最后的key值為數(shù)值之后停止就可以了。
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
這個能實現(xiàn)扁平化是完全按照一個普通的思想做出來的應該有簡化的方法。還有一個問題就是這個只是一個普通的算法,實現(xiàn)函數(shù)的傳參涉及解構(gòu)的知識
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)
這樣就是直接把參數(shù)傳進來,其實這么做的話就已經(jīng)有一點遠離自己的優(yōu)化思想了,如果在內(nèi)部繼續(xù)用這樣的算法就有點愚蠢了。其實好像可以用for v in d.value(): v 來確定遍歷value,來用一個循環(huán)讓我們來實現(xiàn)它吧,我想了一個類似遞歸的循環(huán)。但是總感覺哪里不太對,這個題暫且隔起來,一會再來處理。
想出來一個好點的能實現(xiàn)遞歸的方法就是在每一次當中打一個標記,通過標記可以實現(xiàn)什么時候可以終止循環(huán),之前想的是在遍歷的過程中直接在原有的字典中進行修改,后來發(fā)現(xiàn)好像在遍歷的過程中不能實現(xiàn),就想著每一次能做一個空字典,把有用到的數(shù)據(jù)加進去,有一個不足的地方就是上次的數(shù)據(jù)利用不夠如果每次都這來的話感覺效率一般。改進就先不想了,等著最后的答案吧,。
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
dicx={'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}}
flat(**dicx)
#實現(xiàn)Base64編碼
看這個表其實感覺沒那么難實現(xiàn)啊。用字典就可以了
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一個當子串資格當母串,通過這樣遍歷會找到最長子串,這是我看到這一道題的唯一一種解法,感覺要用兩層循環(huán),而且大概率會想到用while true'來進行判斷。沒寫之前想到一種優(yōu)化的方法就是選擇短的字符串作為子串,稍微長的作為母串這樣會比較優(yōu)化。不對,這樣的想法得出的不是最長子串,想到了一個辣雞方法就是遍歷完,每次記錄。這樣會是最長的,先實現(xiàn)罷。
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)
實現(xiàn)了,但是有一個問題就是如果最大子串相同話只能選取一個,解決方法我還想不出來,因為會把原來maxsub頂?shù)?#xff0c;如果用字典的話大多時候都用不到,暫且不管了。
轉(zhuǎn)載于:https://blog.51cto.com/13890459/2169295
總結(jié)
- 上一篇: NSUserDefault 的使用
- 下一篇: Bootstrap – 1.认识