所以,我想轉換我的字串輸入
'f(g,h(a,b),a,b(g,h))'
進入以下串列
['f',['g','h',['a','b'],'a','b',['g','h']]]
本質上,我想將所有“(”替換為[并將所有“)”替換為]。
我沒有成功地嘗試遞回地做到這一點。我以為我會通過我的單詞遍歷所有變數,然后當我點擊“(”時,我會創建一個新串列并開始將值擴展到該最新串列中。如果我點擊“)”,我將停止擴展值到最新串列中,并將最新串列附加到最近的外部串列中。但是我對遞回很陌生,所以我正在努力思考如何去做
word='f(a,f(a))'
empty=[]
def newlist(word):
listy=[]
for i, letter in enumerate(word):
if letter=='(':
return newlist([word[i 1:]])
if letter==')':
listy.append(newlist)
else:
listy.extend(letter)
return empty.append(listy)
uj5u.com熱心網友回復:
假設您的輸入是這樣的:
a = 'f,(g,h,(a,b),a,b,(g,h))'
我們首先將其拆分為原始部分(“令牌”)。由于您的令牌始終是單個符號,因此這很容易:
tokens = list(a)
現在我們需要兩個函式來處理令牌串列:next_token告訴我們將要處理哪個令牌并將pop_token令牌標記為已處理并將其從串列中洗掉:
def next_token():
return tokens[0] if tokens else None
def pop_token():
tokens.pop(0)
您的輸入由逗號分隔的“專案”組成。示意地,它可以表示為
items = item ( ',' item )*
在 python 代碼中,我們首先讀取一個專案,然后繼續閱讀更多專案,而下一個標記是逗號:
def items():
result = [item()]
while next_token() == ',':
pop_token()
result.append(item())
return result
“專案”是括號中的子串列或字母:
def item():
return sublist() or letter()
要讀取子串列,我們檢查令牌是否是 '(',items上面的使用讀取內容,最后檢查 ')' 如果不存在則恐慌:
def sublist():
if next_token() == '(':
pop_token()
result = items()
if next_token() == ')':
pop_token()
return result
raise SyntaxError()
letter只需回傳下一個令牌。您可能需要在此處添加一些檢查以確保它確實是一封信:
def letter():
result = next_token()
pop_token()
return result
你可以像這樣組織上面的代碼:有一個函式parse接受一個字串并回傳一個串列,并將上面的所有函式放在這個函式中:
def parse(input_string):
def items():
...
def sublist():
...
...etc
tokens = list(input_string)
return items()
uj5u.com熱心網友回復:
一個非常有趣的問題,我最初誤解了一個問題。但是現在這個解決方案相應地起作用了。請注意,我在此解決方案中使用了串列連接 運算子(您通常希望避免這種情況),因此您可以隨意改進它,但您認為合適。
祝你好運,我希望這會有所幫助!
# set some global values, I prefer to keep it
# as a set incase you need to add functionality
# eg if you also want {{a},b} or [ab<c>ed] to work
OPEN_PARENTHESIS = set(["("])
CLOSE_PARENTHESIS = set([")"])
SPACER = set([","])
def recursive_solution(input_str, index):
# base case A: when index exceeds or equals len(input_str)
if index >= len(input_str):
return [], index
char = input_str[index]
# base case B: when we reach a closed parenthesis stop this level of recursive depth
if char in CLOSE_PARENTHESIS:
return [], index
# do the next recursion, return it's value and the index it stops at
recur_val, recur_stop_i = recursive_solution(input_str, index 1)
# with an open parenthesis, we want to continue the recursion after it's associated
# closed parenthesis. and also the recur_val should be within a new dimension of the list
if char in OPEN_PARENTHESIS:
continued_recur_val, continued_recur_stop_i = recursive_solution(input_str, recur_stop_i 1)
return [recur_val] continued_recur_val, continued_recur_stop_i
# for spacers eg "," we just ignore it
if char in SPACER:
return recur_val, recur_stop_i
# and finally with normal characters, we just extent it
return [char] recur_val, recur_stop_i
uj5u.com熱心網友回復:
您可以使用以下代碼獲得預期的答案,但它仍然是字串格式而不是串列。
import re
a='(f(g,h(a,b),a,b(g,h))'
ans=[]
sub=''
def rec(i,sub):
if i>=len(a):
return sub
if a[i]=='(':
if i==0:
sub=rec(i 1,sub '[')
else:
sub=rec(i 1,sub ',[')
elif a[i]==')':
sub=rec(i 1,sub ']')
else:
sub=rec(i 1,sub a[i])
return sub
b=rec(0,'')
print(b)
b=re.sub(r"([a-z] )", r"'\1'", b)
print(b,type(b))
輸出
[f,[g,h,[a,b],a,b,[g,h]]
['f',['g','h',['a','b'],'a','b',['g','h']] <class 'str'>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515667.html
標籤:Python递归嵌套的
下一篇:列印不同深度的陣列
