如何在 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']]
>
我是 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']]
>