簡體   English   中英

如何在Python的嵌套列表中遞歸收集鏈接信息?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM