日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python小括号报错_Python学习记录:括号配对检测问题

發(fā)布時間:2025/6/17 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python小括号报错_Python学习记录:括号配对检测问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Python學(xué)習(xí)記錄:括號配對檢測問題

一、問題描述

在練習(xí)Python程序題的時候,我遇到了括號配對檢測問題。

問題描述:提示用戶輸入一行字符串,其中可能包括小括號 (),請檢查小括號是否配對正確,配對成功與否分別輸出:

配對成功!

配對失敗!

其中,小括號配對要考慮配對順序,即()表示配對,)(不是配對,只考慮小括號配對。

一提起括號配對,我們可能會想到C語言正則表達式計算的符號優(yōu)先級問題,在C語言中我們通常使用棧來解決,而在Python中我們也可以用棧的思路和方法,以列表的形式來實現(xiàn)它。把list當(dāng)做棧來使用,但建立的還是list對象,提供的是list類型的函數(shù)方法。

二、Python列表函數(shù)&方法

序列是Python中最基本的數(shù)據(jù)結(jié)構(gòu)。序列中的每個元素都分配一個數(shù)字——它的位置,或索引,第一個索引是0,第二個索引是1,依此類推。

Python有6個序列的內(nèi)置類型,但最常見的是列表和元組。

序列都可以進行的操作包括索引,切片,加,乘,檢查成員。

此外,Python已經(jīng)內(nèi)置確定序列的長度以及確定最大和最小的元素的方法。

列表是最常用的Python數(shù)據(jù)類型,它可以作為一個方括號內(nèi)的逗號分隔值出現(xiàn)。

列表的數(shù)據(jù)項不需要具有相同的類型。

創(chuàng)建一個列表,只要把逗號分隔的不同的數(shù)據(jù)項使用方括號括起來即可。如下所示:

list1 = ['physics', 'chemistry', 1997, 2000]

list2= [1, 2, 3, 4, 5]

list3= ["a", "b", "c", "d"]

與字符串的索引一樣,列表索引從0開始。列表可以進行截取、組合等。

1.Python包含以下函數(shù):

1)cmp(list1, list2):比較兩個列表的元素

2)len(list):列表元素個數(shù)

3)max(list):返回列表元素最大值

4)min(list):返回列表元素最小值

5)list(seq):將元組轉(zhuǎn)換為列表

①使用len()方法返回列表元素個數(shù)。

len()方法語法:

len(list)

返回列表元素個數(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ū)別在于元組的元素值不能修改,元組是放在括號中,列表是放于方括號中。

以下實例展示了list()函數(shù)的使用方法:

aTuple = (123, 'xyz', 'zara', 'abc')

aList=list(aTuple)print("列表元素:", aList)

輸出結(jié)果如下:

2.Python包含以下方法:

1)list.append(obj):在列表末尾添加新的對象

2)list.count(obj):統(tǒng)計某個元素在列表中出現(xiàn)的次數(shù)

3)list.extend(seq):在列表末尾一次性追加另一個序列中的多個值(用新列表擴展原來的列表)

4)list.index(obj):從列表中找出某個值第一個匹配項的索引位置

5)list.insert(index, obj):將對象插入列表

6)list.pop([index=-1]):移除列表中的一個元素(默認最后一個元素),并且返回該元素的值

7)list.remove(obj):移除列表中某個值的第一個匹配項

8)list.reverse():反向列表中元素

9)list.sort(cmp=None, key=None, reverse=False):對原列表進行排序

①append()方法用于在列表末尾添加新的對象。

append()方法語法:

list.append(obj)

該方法無返回值,但是會修改原來的列表。

以下實例展示了append()函數(shù)的使用方法:

aList = [123, 'xyz', 'zara', 'abc']

aList.append(2009)print("Updated List :", aList)

輸出結(jié)果如下:

②pop()函數(shù)用于移除列表中的一個元素(默認最后一個元素),并且返回該元素的值。

pop()方法語法:

list.pop([index=-1])

obj -- 可選參數(shù),要移除列表元素的索引值,不能超過列表總長度,默認為index=-1,刪除最后一個列表值。

該方法返回從列表中移除的元素對象。

以下實例展示了 pop()函數(shù)的使用方法:

list1 = ['Google', 'Runoob', 'Taobao']

list_pop= list1.pop(1)print("刪除的項為 :", list_pop)print("列表現(xiàn)在為 :", list1)

輸出結(jié)果如下:

三、代碼實現(xiàn)

代碼實現(xiàn)如下:

#使用列表來存放棧元素

defparentheses(m):

list1=[]for i inrange(len(m)):if m[i]=='(' or m[i]==')':

list1.append(m[i])#將小括號元素放在list1

list2=[] #存放(,相當(dāng)于棧

if len(list1)==0: #無小括號元素

returnTrueelif list1[0]==')': #第一個元素為),即)在(前面

returnFalseelif len(list1)%2!=0: #小括號元素總數(shù)為奇數(shù),無論怎么配對也不會成功

returnFalseelse:for i inrange(len(list1)):if list1[i]=='(': #將左括號元素放在list2

list2.append(list1[i])elif list1[i]==')' and len(list2)!=0: #排除右括號比左括號多的情況

list2.pop()#只要list1中有一個右括號且list2中左括號個數(shù)不為0,就移除list2里的一個左括號,以此進行左右括號配對

else:returnFalsereturnTrue

m=input('請輸入字符串:')ifparentheses(m):print('括號配對成功!')else:print('括號配對失敗!')

運行結(jié)果:

上面的程序可以正常運行,但我發(fā)現(xiàn)了新的問題:以上代碼并不適用于所有可能的輸入,比如我輸入(((()),即左括號比右括號多的情況,程序運行結(jié)果卻未報錯。

經(jīng)查閱,我發(fā)現(xiàn)網(wǎng)上關(guān)于Python括號配對的問題基本上都是利用列表方法實現(xiàn),但關(guān)于不合理輸入的異常處理情況考慮的比較少。這里列出了一些有代表性的可能的輸入情況,并且對每一種輸入情況進行處理,符合括號配對原則的配對成功,否則失敗。

可能存在情況:((())).(((()).(()))).()()等等。

可以看到,當(dāng)左括號比右括號多時,上面的代碼無法處理異常。這里我用自己的思路對上面的代碼進行修改,修改后的代碼如下:

#使用列表來存放棧元素

defbracketsmatch(m):

list1=[]

left=[]#存放(,相當(dāng)于棧

right=[]#存放),相當(dāng)于棧

for i inrange(len(m)):if m[i]=='(' or m[i]==')':

list1.append(m[i])#將小括號元素放在list1

if len(list1)==0:#無小括號元素

returnTrueelif list1[0]==')':#第一個元素為),即)在(前面

returnFalseelif len(list1)%2!=0:#小括號元素總數(shù)為奇數(shù),無論怎么配對也不會成功

returnFalseelse:for i inrange(len(list1)):if list1[i]=='(':

left.append(list1[i])#將左括號元素放在left

elif list1[i]==')' and len(left)!=0:#排除右括號比左括號多的情況

right.append(list1[i])#將右括號元素放在right

left.pop()#只要有一個右括號進入right,就將其移除,同時移除left里的一個左括號,以此進行左右括號配對

right.pop()if len(left)==0 and len(right)==0:#如果左右括號配對完畢

returnTrueelse:#左右括號未配對完畢,繼續(xù)執(zhí)行循環(huán)

continue

else:returnFalse

m=input('請輸入字符串:')ifbracketsmatch(m):print('括號配對成功!')else:print('括號配對失敗!')

運行結(jié)果:

修改后的代碼雖然處理了左括號比右括號多時的異常情況,但又無法處理右括號比左括號多的情況。這也是讓我有點頭疼的一點,即使我知道是程序算法設(shè)計的問題,但由于時間問題,我沒來得及再進一步深入解決這個問題,后續(xù)時間里我會繼續(xù)思考,爭取將這個缺口補上。

參考資料:

總結(jié)

以上是生活随笔為你收集整理的python小括号报错_Python学习记录:括号配对检测问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。