日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

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

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)容,希望文章能夠幫你解決所遇到的問題。

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