如何在 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 之间已经有一个 link。但是为了能够进一步跟踪,我需要搜索一个子列表,该子列表的第一个元素是 '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

我已经尝试编写一个递归函数来跟踪所有 linked 数据,但它并没有像它应该的那样工作。

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]))

您需要仔细描述整个过程中的每个结构并考虑一切

输出

> python3 test.py
[['V1', 'P1', 'R1', 'S1'], ['V1', 'P1', 'R1', 'Z1']]
[['P1', 'R1', 'S1'], ['P1', 'R1', 'Z1']]
>