【问题标题】:outputting an adjacency list from sets of neighbors in an undirected graph从无向图中的邻居集合中输出邻接表
【发布时间】:2019-09-23 17:45:50
【问题描述】:

假设我们有以下无向图:

        0
       /  \
      1    2
            \
             3 
      4

我正在编写一个函数,该函数将上图的表示形式作为输入,如下所示:

[{1, 2}, set(), {3}, set()]

这是一个集合列表,其中每个集合索引代表一个节点,集合中的每个元素都代表该节点的子节点。它应该获取这个列表,并输出一个如下所示的文本文件:

   0
   0,3
   2 
   -

这是一个邻接表,其中每个行号(未写)代表节点,每个行内元素是节点的邻居。任何没有邻居的顶点(如 4)都应该在其线上有一个“-”。

我正在努力编写一个将节点的父节点也写在前面的函数。谁能想到一个pythonic的方式来做到这一点?

到目前为止,我没有做它的工作!这里的n是T的长度:

def processT(T,n):
    string = ""
    for i in range(n):
        elem = str(T[i])
        if elem != "set()":
            string += elem.strip("{}").replace(" ","") + "\n"
        else:
            string += "-\n"
    file1 = open("output.txt", "w")
    file1.write(string)
    file1.close()

任何想法都会非常有帮助。谢谢!

【问题讨论】:

    标签: python tree breadth-first-search adjacency-list


    【解决方案1】:

    怎么样(我只是打印而不是写入文件)

    def set_to_str(s):
        if len(s) == 0:
            return "-"
        else:
            return ",".join(map(str, s))
    
    T = [{1, 2}, set(), {3}, set()]
    for i, s in zip(range(len(T)), T):
        set_str = set_to_str(s)
        print("{} {}".format(i, set_str))
    

    【讨论】:

    • 一种真正的(几乎不可读的)python 方式:只需将 for 循环替换为 "\n".join([f"{i} {set_to_str(s)}" for (i,s) in zip(range(len(T)), T)]) 注意:这只适用于 Python 3.6 或更高版本。
    • 作为一般规则:不要从已经很好表示的数据(集合或列表)创建字符串并处理该字符串。使用列表理解、map() 和 str.join() 通常要简单得多。
    • 这段代码的主要问题是我不应该写行号。例如,在一个大的邻接列表上,我得到:` 0 1,2 1 3,4 2 6,7 3 - 4 5 5 - 6 - 7 - ` 当它应该是 1,2 0,3,4 0,6,7 1 1,5 4 2 2
    • 然后在 f 字符串表达式中省略{i}。
    • 但是,例如,如果我有 2 个节点:0 -- 1 并且它们相互连接,这将输出 1 然后 - 当它应该是 1 和0。这是一个无向图,我们必须将父节点列为邻居
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2020-01-29
    • 1970-01-01
    相关资源
    最近更新 更多