Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多链接结构的递归方法_Python - Fatal编程技术网

Python 多链接结构的递归方法

Python 多链接结构的递归方法,python,Python,我有一个python类,它接受两个散列并将它们链接在一起。我想要的是能够递归地获取所有链接的哈希,但是我正在努力编写一个正确的递归函数。 到目前为止,我所拥有的: class MultiLink: def __init__(self): self.map = {} def get(self, md5: str, scanned: list = None) -> list: matches = [] scanned = sca

我有一个python类,它接受两个散列并将它们链接在一起。我想要的是能够递归地获取所有链接的哈希,但是我正在努力编写一个正确的递归函数。 到目前为止,我所拥有的:

class MultiLink:
    def __init__(self):
        self.map = {}

    def get(self, md5: str, scanned: list = None) -> list:
        matches = []
        scanned = scanned or []
        for match in self.map[md5]:
            matches.append(match)

            if match in scanned:
                continue

            scanned.append(match)
            for mmatch in self.map[match]:
                if mmatch not in scanned:
                    matches += self.get(mmatch, scanned=scanned)

        return list(set(matches))

    def link(self, first: str, second: str) -> None:
        try:
            self.map[first].append(second)
        except KeyError:
            self.map[first] = [second]

        try:
            self.map[second].append(first)
        except KeyError:
            self.map[second] = [first]
正如您所看到的,输出并不像我期望的那样执行:

l = MultiLink()
l.link("a", "b")
l.link("b", "c")
l.link("c", "a")
l.get("c")
这将输出
['c','b','a']
,但
l.get(“a”)
输出
['c','b']

如果我接着执行
l.link(“d”,“a”)
,它将返回
['c','a']
,而不是整个结果集

相反,我想要的是get函数从给定节点开始,递归地跟随所有其他节点,直到它获取所有直接或间接链接的节点。因此
l.get(“b”)
将返回
[“a”、“c”、“d”]
,“d”,因为它是通过“a”链接的。同样地,
l.get(“d”)
将获取所有其他字母,因为它们通过“a”链接


这是我第一次尝试写这样的东西,所以我肯定我在某处犯了一个非常愚蠢的错误,但我自己找不到。有人知道怎么做吗?或者如果已经在某处实现了这一点?我检查了collections模块,但没有发现任何感兴趣的内容。

简单的图形遍历即可:

稍微更改代码以使用
集合
并应用:

类多链接:
定义初始化(自):
self.map={}
def get(自我,md5:str)->设置:
结果=集合([])
def DFS(键:str)->无:
对于self.map[键]中的匹配:
如果结果中不匹配,则匹配!=md5:
结果。添加(匹配)
DFS(匹配)
DFS(md5)
返回结果
def链接(self,第一个:str,第二个:str)->无:
如果在self.map中处于第一位:
self.map[first].add(second)
其他:
self.map[first]=set([second])
如果是self.map中的第二个:
self.map[second].add(first)
其他:
self.map[second]=set([first])

给定样本的预期输出是什么?您需要描述行为应该是什么。从你的描述中不明显。例如,“接受两个散列并将它们链接在一起”并没有使用标准术语,也不清楚您的意思我希望基本上递归地跟踪所有链接。因此在我的示例中,l.get(“c”)将返回[“d”、“b”、“a”],因为这些字母都链接在一起。我将更新描述,请更新您的问题,并明确指出这些输出。不要把它们写在评论里。更新了,我希望现在更清楚。这正是我要找的,谢谢。我一开始读过图表,但我从来没有听说过DFS,所以我可能永远也不会自己弄明白。根据链接的大小,可能会遇到递归错误。您还可以使用堆栈数据结构而不是调用堆栈将DFS实现为迭代算法。