python小括号报错_Python学习记录:括号配对检测问题
Python學(xué)習(xí)記錄:括號(hào)配對(duì)檢測問題
一、問題描述
在練習(xí)Python程序題的時(shí)候,我遇到了括號(hào)配對(duì)檢測問題。
問題描述:提示用戶輸入一行字符串,其中可能包括小括號(hào) (),請(qǐng)檢查小括號(hào)是否配對(duì)正確,配對(duì)成功與否分別輸出:
配對(duì)成功!
配對(duì)失敗!
其中,小括號(hào)配對(duì)要考慮配對(duì)順序,即()表示配對(duì),)(不是配對(duì),只考慮小括號(hào)配對(duì)。
一提起括號(hào)配對(duì),我們可能會(huì)想到C語言正則表達(dá)式計(jì)算的符號(hào)優(yōu)先級(jí)問題,在C語言中我們通常使用棧來解決,而在Python中我們也可以用棧的思路和方法,以列表的形式來實(shí)現(xiàn)它。把list當(dāng)做棧來使用,但建立的還是list對(duì)象,提供的是list類型的函數(shù)方法。
二、Python列表函數(shù)&方法
序列是Python中最基本的數(shù)據(jù)結(jié)構(gòu)。序列中的每個(gè)元素都分配一個(gè)數(shù)字——它的位置,或索引,第一個(gè)索引是0,第二個(gè)索引是1,依此類推。
Python有6個(gè)序列的內(nèi)置類型,但最常見的是列表和元組。
序列都可以進(jìn)行的操作包括索引,切片,加,乘,檢查成員。
此外,Python已經(jīng)內(nèi)置確定序列的長度以及確定最大和最小的元素的方法。
列表是最常用的Python數(shù)據(jù)類型,它可以作為一個(gè)方括號(hào)內(nèi)的逗號(hào)分隔值出現(xiàn)。
列表的數(shù)據(jù)項(xiàng)不需要具有相同的類型。
創(chuàng)建一個(gè)列表,只要把逗號(hào)分隔的不同的數(shù)據(jù)項(xiàng)使用方括號(hào)括起來即可。如下所示:
list1 = ['physics', 'chemistry', 1997, 2000]
list2= [1, 2, 3, 4, 5]
list3= ["a", "b", "c", "d"]
與字符串的索引一樣,列表索引從0開始。列表可以進(jìn)行截取、組合等。
1.Python包含以下函數(shù):
1)cmp(list1, list2):比較兩個(gè)列表的元素
2)len(list):列表元素個(gè)數(shù)
3)max(list):返回列表元素最大值
4)min(list):返回列表元素最小值
5)list(seq):將元組轉(zhuǎn)換為列表
①使用len()方法返回列表元素個(gè)數(shù)。
len()方法語法:
len(list)
返回列表元素個(gè)數(shù)。
以下實(shí)例展示了len()函數(shù)的使用方法:
list1, list2 = [123, 'xyz', 'zara'], [456, 'abc']print("First list length :",len(list1))print("Second list length :",len(list2))
輸出結(jié)果如下:
②list()方法用于將元組轉(zhuǎn)換為列表。
list()方法語法:
list(tup)
返回列表。
注:元組與列表是非常類似的,區(qū)別在于元組的元素值不能修改,元組是放在括號(hào)中,列表是放于方括號(hào)中。
以下實(shí)例展示了list()函數(shù)的使用方法:
aTuple = (123, 'xyz', 'zara', 'abc')
aList=list(aTuple)print("列表元素:", aList)
輸出結(jié)果如下:
2.Python包含以下方法:
1)list.append(obj):在列表末尾添加新的對(duì)象
2)list.count(obj):統(tǒng)計(jì)某個(gè)元素在列表中出現(xiàn)的次數(shù)
3)list.extend(seq):在列表末尾一次性追加另一個(gè)序列中的多個(gè)值(用新列表擴(kuò)展原來的列表)
4)list.index(obj):從列表中找出某個(gè)值第一個(gè)匹配項(xiàng)的索引位置
5)list.insert(index, obj):將對(duì)象插入列表
6)list.pop([index=-1]):移除列表中的一個(gè)元素(默認(rèn)最后一個(gè)元素),并且返回該元素的值
7)list.remove(obj):移除列表中某個(gè)值的第一個(gè)匹配項(xiàng)
8)list.reverse():反向列表中元素
9)list.sort(cmp=None, key=None, reverse=False):對(duì)原列表進(jìn)行排序
①append()方法用于在列表末尾添加新的對(duì)象。
append()方法語法:
list.append(obj)
該方法無返回值,但是會(huì)修改原來的列表。
以下實(shí)例展示了append()函數(shù)的使用方法:
aList = [123, 'xyz', 'zara', 'abc']
aList.append(2009)print("Updated List :", aList)
輸出結(jié)果如下:
②pop()函數(shù)用于移除列表中的一個(gè)元素(默認(rèn)最后一個(gè)元素),并且返回該元素的值。
pop()方法語法:
list.pop([index=-1])
obj -- 可選參數(shù),要移除列表元素的索引值,不能超過列表總長度,默認(rèn)為index=-1,刪除最后一個(gè)列表值。
該方法返回從列表中移除的元素對(duì)象。
以下實(shí)例展示了 pop()函數(shù)的使用方法:
list1 = ['Google', 'Runoob', 'Taobao']
list_pop= list1.pop(1)print("刪除的項(xiàng)為 :", list_pop)print("列表現(xiàn)在為 :", list1)
輸出結(jié)果如下:
三、代碼實(shí)現(xiàn)
代碼實(shí)現(xiàn)如下:
#使用列表來存放棧元素
defparentheses(m):
list1=[]for i inrange(len(m)):if m[i]=='(' or m[i]==')':
list1.append(m[i])#將小括號(hào)元素放在list1
list2=[] #存放(,相當(dāng)于棧
if len(list1)==0: #無小括號(hào)元素
returnTrueelif list1[0]==')': #第一個(gè)元素為),即)在(前面
returnFalseelif len(list1)%2!=0: #小括號(hào)元素總數(shù)為奇數(shù),無論怎么配對(duì)也不會(huì)成功
returnFalseelse:for i inrange(len(list1)):if list1[i]=='(': #將左括號(hào)元素放在list2
list2.append(list1[i])elif list1[i]==')' and len(list2)!=0: #排除右括號(hào)比左括號(hào)多的情況
list2.pop()#只要list1中有一個(gè)右括號(hào)且list2中左括號(hào)個(gè)數(shù)不為0,就移除list2里的一個(gè)左括號(hào),以此進(jìn)行左右括號(hào)配對(duì)
else:returnFalsereturnTrue
m=input('請(qǐng)輸入字符串:')ifparentheses(m):print('括號(hào)配對(duì)成功!')else:print('括號(hào)配對(duì)失敗!')
運(yùn)行結(jié)果:
上面的程序可以正常運(yùn)行,但我發(fā)現(xiàn)了新的問題:以上代碼并不適用于所有可能的輸入,比如我輸入(((()),即左括號(hào)比右括號(hào)多的情況,程序運(yùn)行結(jié)果卻未報(bào)錯(cuò)。
經(jīng)查閱,我發(fā)現(xiàn)網(wǎng)上關(guān)于Python括號(hào)配對(duì)的問題基本上都是利用列表方法實(shí)現(xiàn),但關(guān)于不合理輸入的異常處理情況考慮的比較少。這里列出了一些有代表性的可能的輸入情況,并且對(duì)每一種輸入情況進(jìn)行處理,符合括號(hào)配對(duì)原則的配對(duì)成功,否則失敗。
可能存在情況:((())).(((()).(()))).()()等等。
可以看到,當(dāng)左括號(hào)比右括號(hào)多時(shí),上面的代碼無法處理異常。這里我用自己的思路對(duì)上面的代碼進(jìn)行修改,修改后的代碼如下:
#使用列表來存放棧元素
defbracketsmatch(m):
list1=[]
left=[]#存放(,相當(dāng)于棧
right=[]#存放),相當(dāng)于棧
for i inrange(len(m)):if m[i]=='(' or m[i]==')':
list1.append(m[i])#將小括號(hào)元素放在list1
if len(list1)==0:#無小括號(hào)元素
returnTrueelif list1[0]==')':#第一個(gè)元素為),即)在(前面
returnFalseelif len(list1)%2!=0:#小括號(hào)元素總數(shù)為奇數(shù),無論怎么配對(duì)也不會(huì)成功
returnFalseelse:for i inrange(len(list1)):if list1[i]=='(':
left.append(list1[i])#將左括號(hào)元素放在left
elif list1[i]==')' and len(left)!=0:#排除右括號(hào)比左括號(hào)多的情況
right.append(list1[i])#將右括號(hào)元素放在right
left.pop()#只要有一個(gè)右括號(hào)進(jìn)入right,就將其移除,同時(shí)移除left里的一個(gè)左括號(hào),以此進(jìn)行左右括號(hào)配對(duì)
right.pop()if len(left)==0 and len(right)==0:#如果左右括號(hào)配對(duì)完畢
returnTrueelse:#左右括號(hào)未配對(duì)完畢,繼續(xù)執(zhí)行循環(huán)
continue
else:returnFalse
m=input('請(qǐng)輸入字符串:')ifbracketsmatch(m):print('括號(hào)配對(duì)成功!')else:print('括號(hào)配對(duì)失敗!')
運(yùn)行結(jié)果:
修改后的代碼雖然處理了左括號(hào)比右括號(hào)多時(shí)的異常情況,但又無法處理右括號(hào)比左括號(hào)多的情況。這也是讓我有點(diǎn)頭疼的一點(diǎn),即使我知道是程序算法設(shè)計(jì)的問題,但由于時(shí)間問題,我沒來得及再進(jìn)一步深入解決這個(gè)問題,后續(xù)時(shí)間里我會(huì)繼續(xù)思考,爭取將這個(gè)缺口補(bǔ)上。
參考資料:
總結(jié)
以上是生活随笔為你收集整理的python小括号报错_Python学习记录:括号配对检测问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python rbf神经网络_原创,基于
- 下一篇: python绘图课设_python课程设