【问题标题】:How to recursively collect linked information in nested list on Python?如何在 Python 的嵌套列表中递归收集链接信息?
【发布时间】:2019-08-15 13:27:52
【问题描述】:

我是 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):]))

提前感谢您的帮助。

【问题讨论】:

  • XB 值的含义是什么?
  • X 和 B 是“原因”和“影响”值。通常在元组区域中,第二位是“原因”表示,第三位是“效果”。此代码将用于获取关键基础设施的故障场景。我正在搜索原因值何时与影响值匹配,以找出哪些组件将从可能的故障原因中依次受到影响。

标签: python recursion nested-lists


【解决方案1】:

我相信您严重低估了实现您所描述的内容所需的逻辑量。如果有不止一种可能性,那么在每个级别上,您都需要处理从递归返回的所有可能性,您的代码只是考虑单例。及其他问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2014-03-06
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多