[英]How to recursively collect linked information in nested list on Python?
我是python的初學者,我遇到了一個問題,我不知道如何處理。
我有一個嵌套列表,其中每個子列表都有一個字符串和三個字符串的元組:
[['V1', ('P1', 'B', 'X')], ['R1', ('S1', 'B', 'G')], ['V1', ('R1', 'B', 'L')], ['R1', ('Z1', 'B', 'Z')], ['R1', ('P1', 'X', 'A')], ['P1', ('R1', 'X', 'B')]]
我需要跟蹤關鍵信息之間的共同信息,以獲得刺激鏈。
例如,在屬於“ V1”的第一個子列表中,我們在元組位置的第一位是“ P1”,在第三位的位置是“ X”。 這意味着我們已經在V1和P1之間建立了聯系。 但是為了能夠進一步跟蹤,我需要搜索一個子列表,該子列表的第一個元素為“ P1”,第二個位置的元組中為“ X”,例如,列表的最后一個示例:
['P1', ('R1', 'X', 'B')]]
如果存在該連接,則意味着我們在V1-> P1-> R1之間有一條鏈
我應該繼續將“ R1”作為子列表的下一個第一位置,並將“ B”作為其元組中的第二個條件。 舉個例子:
['R1', ('Z1', 'B', 'Z')]
這會將我們的鏈修改為V1-> P1-> R1-> Z1
這種遞歸應該繼續進行,直到我們找不到子列表的第一個元素(其元組的第二個位置具有條件)為止。
我要指出,如果存在一種以上的連接可能性,則這些可能性應形成不同的鏈,例如:
V1 -> P1 -> R1 ->Z1
V1 -> P1 -> R1 ->S1
我已經嘗試編寫一個用於跟蹤所有鏈接數據的遞歸函數,但是它並不像應該的那樣工作。
def loop_search(item, listt):
list_rel=[item[0]] #we will save chain in form of a list
if len(listt)==0:
return list_rel
else:
for i in listt:
if item[1][0]==i[0] and item[1][2]==i[1][1]:
list_rel.append(loop_search(i,listt[len(listt):]))
預先感謝您的幫助。
我相信您已經嚴重低估了實現您所描述的內容所需的邏輯量。 如果存在不止一種可能性,那么在每個級別上,您都需要處理從遞歸返回的所有可能性,您的代碼只會考慮單例。 和其他問題:
LINKS = [ \
['V1', ('P1', 'B', 'X')], \
['R1', ('S1', 'B', 'G')], \
['V1', ('R1', 'B', 'L')], \
['R1', ('Z1', 'B', 'Z')], \
['R1', ('P1', 'X', 'A')], \
['P1', ('R1', 'X', 'B')], \
]
def link_search_recursive(item, links):
_, (first, _, effect) = item
chains = []
for idx, link in enumerate(links):
link_key, (link_first, cause, _) = link
if first == link_key and effect == cause:
sub_chains = link_search_recursive(link, links[:idx] + links[idx + 1:])
if sub_chains:
for chain in sub_chains:
chains.append([first] + chain)
else:
chains.append([first, link_first])
return chains
def link_search(item, links):
chains = link_search_recursive(item, links)
key, _ = item
return [[key] + chain for chain in chains]
print(link_search(LINKS[0], LINKS[1:]))
print(link_search(LINKS[-1], LINKS[:-1]))
您需要仔細描述整個過程中的每個結構並說明所有問題 。
OUTPUT
> python3 test.py
[['V1', 'P1', 'R1', 'S1'], ['V1', 'P1', 'R1', 'Z1']]
[['P1', 'R1', 'S1'], ['P1', 'R1', 'Z1']]
>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.