【发布时间】:2019-08-16 00:17:04
【问题描述】:
我正在尝试使用 Python AnyTree 模块将 URL 重定向映射到树中,而不创建任何重复节点。
我尝试使用 AnyTree 文档和类似问题来处理代码,例如Tree with no duplicate children
我当前的代码是:
from anytree import Node, RenderTree
root_nodes = []
for url in redirections:
is_root = True
for redir in redirections:
if url['url'] == redir['redir']:
is_root = False
if is_root:
root = Node(url['url'])
root_nodes.append(root)
for root in root_nodes:
for redir in redirections:
if redir['url'] == root.name:
sub = Node(redir['redir'], parent=root)
else:
sub = next((c for c in root.children if c.name == redir['url']), None)
if sub is None:
sub = Node(redir['redir'], parent=root)
else:
new_node = sub
sub = Node(redir['redir'], parent=new_node)
基本上,给定一个重定向列表,例如:
redirections = [
{
'url': "alpha.com",
'redir_url': "beta.com",
},
{
'url': "alpha.com",
'redir_url': "charlie.com",
},
{
'url': "beta.com",
'redir_url': "charlie.com",
},
{
'url': "beta.com",
'redir_url': "delta.com",
},
{
'url': "delta.com",
'redir_url': "foxtrot.com",
},
{
'url': "foxtrot.com",
'redir_url': "golf.com",
},
{
'url': "india.com",
'redir_url': "charlie.com",
},
{
'url': "india.com",
'redir_url': "juliet.com",
},
]
我希望 AnyTree 产生如下输出:
alpha.com -> beta.com -> charlie.com
-> delta.com -> foxtrot.com -> golf.com
-> charlie.com
india.com -> charlie.com
-> juliet.com
相反,它当前打印:
alpha.com
├── beta.com
│ ├── charlie.com
│ └── delta.com
├── charlie.com
├── foxtrot.com
│ └── golf.com
├── charlie.com
└── juliet.com
india.com
├── beta.com
│ ├── charlie.com
│ └── delta.com
├── charlie.com
├── foxtrot.com
│ └── golf.com
├── charlie.com
└── juliet.com
如您所见,有很多重复项。此外,狐步舞和高尔夫也没有添加到三角链中。最后,印度还有那些不会从这些 URL 发生的人重定向。
请注意,重定向数组可以是任何顺序(不一定是重定向发生的顺序)
【问题讨论】: