函数习题
#把一個字典扁平化
#源字典 {'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
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頂掉,如果用字典的話大多時候都用不到,暫且不管了。
轉載于:https://blog.51cto.com/13890459/2169295
總結
- 上一篇: NSUserDefault 的使用
- 下一篇: 数据库面试题