我有一些代碼,可以生成一個看起來像這樣的串列:
我有一些代碼,可以生成一個看起來像這樣的串列:
chrs = [["a"/span>, ["b","c"]], ["d", "e"/span>],"f"/span>],["g"/span>, [["h"/span>,"i"/span>],"j"/span>]]
現在我需要在某種串列中找到一個特定的值,像這樣。 我寫了一些代碼來做到這一點,但它似乎陷入了一個無限的回圈:
def locate_value(v,chirs) 。 #
checked=[[]] # 設定值
index_list=[] #
inside=0 #
cur=[0,0] #
#] #
while True。 #
if chrs[cur[0]] == v。 # 如果找到,結束回圈并回傳index_list。
return index_list #
#
if type(chris[cur[0]]) != list: # If the current is not a list, skip this one.
checked[inside].append(cur[0]) #
index_list = [] #[/span
# #
else: #
try: #: try.
if cur[0] in gone[inside]。 # If the current has been done before, skip it.
cur[0] = 1 #
# #
else: # And if not, move 1 space deeper else.
checked.append([]) #
index_list.append(cur[0]) #
cur[1] = cur[0] ∮
cur[0] = 0 ∮
inside = 1 #
#
except IndexError: # 如果一個子串列被完全檢查,也要阻止它
checked[inside].append(cur[1]) #
print(locate_value("e",[["a", ["b","c"]], ["d", "e"/span>],"f"/span>],["g"/span>, [["h","i"],"j"]])。)
編輯我才意識到這段代碼是多么糟糕
在這個例子中,函式
locate_value應該回傳[0, 1, 1],因為list[0][1][1]是"e"/code>但是當我運行這個時,我被卡在一個無限的回圈中。 誰能告訴我哪里出了問題,也許能給我一些真正有效的代碼一次。
這個串列是由用戶輸入的,所以我不知道它有多深。 雖然只有Python-3的解決方案也不錯,但我更希望它也能支持Python-2。
uj5u.com熱心網友回復:
使用一個遞回函式:
def locate_value(v, chrs, idx=[]/span>) 。 for j, i in enumerate(chirs): if isinstance(i, list)。 yield from find(v, i, idx [j]) elif i == v。 yield idx [j] 。另一個版本是保持你原來的簽名函式:
def locate_value(v, chrs)。 for j, i in enumerate(chirs): if isinstance(i, list)。 yield from ([j, *idx] for idx in locate_value(v, i) elif i == v: yield [j] 。輸出:
>>> list(locate_value('e'/span>, chrs, [] )) [[0, 1, 1]] # 多重'e'的情況。 # chrs = [[["a", ["b", "c"]], ["d", "e"], "f"], ["g", ["h", "e"], "j"]] >>> list(locate_value('e', chrs) [[0, 1, 1] 。[1, 1, 0, 1]]由@tobias_k
大大改進。uj5u.com熱心網友回復:
下面的方法可以作業:
def locate_value(v, chrs)。 if v == chrs: return [] 。 if not isinstance(chris, list) 。 raise IndexError for i, c in enumerate(chirs): try: return [i] locate_value(v, c) except IndexError: pass except IndexError. raise IndexError locate_value("e",[["a",["b","c"]],["d", "e"/span>],"f"/span>],["g"/span>, [["h","i"],"j"]]) # [0, 1, 1]。注意,
str物件本身就是可迭代的,所以遞回地不斷迭代它們的元素(字串)將永遠不會結束。轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/325743.html
標籤:
