如何从列表中识别第一个和最后一个节点及其组 - Python

Posted

技术标签:

【中文标题】如何从列表中识别第一个和最后一个节点及其组 - Python【英文标题】:How to identify first and last node and their group from a List - Python 【发布时间】:2019-04-02 19:12:27 【问题描述】:

我是 python 新手,正在尝试用我的数据构建图表。我有一个嵌套列表,我想根据关系分隔 2 组组,以便输出图特定于一个组。我能够得到一个完整的图表,但我想使用 python 简化 2 个图表,因为要求有数千个对象。

RelationList=[["A","B"],["B","C"],["B","D"],["D","E"],["X","Y"],["Y","Z"],["Z","U"]]

输出:

Graph 1 : 

A->B
B->C
B->D
D->E

Graph 2 :

X->Y
Y->Z
Z->U

请指导我编写代码。

【问题讨论】:

问题标题与您的问题有何关系?您声称已经能够获得一个图表,因此您似乎可以访问每对的第一个和最后一个元素。您将图表分开的条件是什么?您在寻找未连接的图吗?您是否尝试过一些可用于 Python 的图形库? 【参考方案1】:

您可以使用数组索引来获取某些元素。数组索引工作如下:array[start:end:step]

要获取第一个节点,使用array[0],最后一个节点是array[-1],要获取连续的组,可以使用array[0:3]等范围

【讨论】:

【参考方案2】:

你可以这样做: 首先为graph1创建一个包含所有可能节点的列表

graph1_nodes = ["A", "B", "C", "D", "E"]

获得该列表后,您必须对其进行迭代并将其与当前的 RelationList 进行比较,并创建一个子列表,这将是您所要求的图表之一。为此,请创建一个空列表,其中将填充 graph1 的数据

Graph1 = []
Graph2 = []
for node in RelationList:
    # node is the first element of the list
    if node[0] in graph1_nodes:
        # node[0] take the first position of the element
        Graph1.append(node)
    else:
        Graph2.append(node)

最后的输出是这样的:

Graph1 = [["A","B"],["B","C"],["B","D"],["D","E"]]
Graph2 = [["X","Y"],["Y","Z"],["Z","U"]]

希望我有所帮助!

【讨论】:

【参考方案3】:

您可以为此使用Union Find, or Disjoint Set 数据结构和算法。这适用于任意数量的节点和子图,并且子图是否存储在列表的封闭区域中并不重要。这非常有用,我手头总是有一个简单的实现:

from collections import defaultdict
class UnionFind:
    def __init__(self):
        self.leaders = defaultdict(lambda: None)
    def find(self, x):
        l = self.leaders[x]
        if l is not None:
            l = self.find(l)
            self.leaders[x] = l
            return l
        return x
    def union(self, x, y):
        lx, ly = self.find(x), self.find(y)
        if lx != ly:
            self.leaders[lx] = ly
    def get_groups(self):
        groups = defaultdict(set)
        for x in self.leaders:
            groups[self.find(x)].add(x)
        return list(groups.values())

向您的RelationList申请:

RelationList=[["A","B"],["B","C"],["B","D"],["D","E"],["X","Y"],["Y","Z"],["Z","U"]]
uf = UnionFind()
for a, b in RelationList:
    uf.union(a, b)
print(uf.get_groups()) # ['C', 'A', 'D', 'B', 'E', 'U', 'Z', 'Y', 'X']

【讨论】:

以上是关于如何从列表中识别第一个和最后一个节点及其组 - Python的主要内容,如果未能解决你的问题,请参考以下文章

节点已插入,但输入的第一个节点已从列表中删除

vSAN集群 无法识别磁盘处理

如何从复选框列表中获取最新的选定值?

如何删除链接列表中的第一个节点?

数据结构和算法基础知识点

.从列表结束中删除第N个节点