返回顶部
首页 > 资讯 > 后端开发 > Python >Python怎么自定义邻接表图类
  • 199
分享到

Python怎么自定义邻接表图类

2023-07-04 20:07:19 199人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“python怎么自定义邻接表图类”,在日常操作中,相信很多人在Python怎么自定义邻接表图类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么自定义邻接表图类”的疑惑有所帮助!

这篇文章主要介绍“python怎么自定义邻接表图类”,在日常操作中,相信很多人在Python怎么自定义邻接表图类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么自定义邻接表图类”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    Python自定义邻接表图类

    图抽象数据类型(ADT)的术语

    顶点(Vertex):也称节点(node),是图的基础部分。具有名称标识“key”。顶点也可以有附加信息项“playload”。

    边(Edge):也称弧(arc),也是图的基础组成部分。如果一条边连接两个顶点,则表示两者具有联系。边可以是单向的,也可以是双向的。如果图中的边都是单向的,则称这个图是“有向图(directed graph/digraph)”。

    权重(Weight):为了表达从一个顶点到另一个顶点的“代价”,可以给边赋权。

    路径(Path):图中的路径,是由边依次连接起来的顶点序列。无权路径的长度为边的数量。带权路径的长度为所有边的权重之和。

    圈(Cycle):有向图里的圈是首尾顶点相同的路径。没有圈的图称为“无圈图(acyclic graph)”,没有圈的有向图称为“有向无圈图(directed acyclic graph 或 DAG)”。

    实现图的两个著名方法:邻接矩阵(adjacency matrix)和邻接表(adjacency list)。

    邻接矩阵和邻接表的优缺点

    二维矩阵中,每行和每列都代表图中的顶点。如果顶点v到顶点w之间有边相连,则将值储存在矩阵的v行、w列。每一格的值代表了从顶点v到顶点w边的权重。

    邻接矩阵的优点:是简单,然而,大部分的矩阵是空的,这种情况则称矩阵是“稀疏”的。矩阵并不是一个储存稀疏数据的有效途径。

    实现稀疏图的更高效方法是使用邻接表(adjacency list)。

    在这个实现方法中,包含一个含有所有顶点的主列表(master list),主列表中的每个顶点,再关联一个与自身有边连接的所有顶点的列表。

    在实现顶点类的方法中使用字典而不是列表,字典中的键(key)对应顶点,值(value)则保存顶点连接边的权重。

    邻接表的优点:是能高效地表示一个稀疏图。邻接表还能很容易的找到某个顶点与其他顶点的所有连接。

    自定义顶点类

    class Vertex(object):# 初始化顶点def __init__(self, key):self.id = key #初始化顶点的键self.connectedTo = {}#初始化顶点的值# 添加邻居顶点,参数nbr是邻居顶点的键,默认权重为0def addNeighbor(self, nbr, weight=0):self.connectedTo[nbr] = weightdef __str__(self):return str(self.id) + ' connectedTo: ' + str([x.id for x in self.connectedTo])# 获取该顶点所有邻居顶点的键def getConnections(self):return self.connectedTo.keys()# 获取顶点的键def getId(self):return self.id# 获取到某邻居顶点的权重def getWeight(self, nbr):return self.connectedTo[nbr]# 自定义图类class Graph(object):# 初始化图def __init__(self):self.vertList = {}#初始化邻接表self.numVertices = 0 #初始化顶点数# 添加顶点def addVertex(self, key):newVertex = Vertex(key)#创建顶点self.vertList[key] = newVertex #将新顶点添加到邻接表中self.numVertices = self.numVertices + 1 #邻接表中顶点数+1return newVertex# 获取顶点def getVertex(self, n):if n in self.vertList:#若待查询顶点在邻接表中,则return self.vertList[n] #返回该顶点else:return None# 使之可用in方法def __contains__(self, n):return n in self.vertList# 添加边,参数f为起始顶点的键,t为目标顶点的键,cost为权重def addEdge(self, f, t, cost=0):if f not in self.vertList:#起始顶点不在邻接表中,则self.addVertex(f) #添加起始顶点if t not in self.vertList:#目标顶点不在邻接表中,则self.addVertex(t)#添加目标顶点self.vertList[f].addNeighbor(self.vertList[t], cost)#在邻接表中添加起始点的目标点及权重# 获取邻接表中所有顶点的键def getVertices(self):return self.vertList.keys()# 迭代显示邻接表的每个顶点的邻居节点def __iter__(self):return iter(self.vertList.values())g = Graph() #实例化图类for i in range(6): g.addVertex(i) #给邻接表添加节点print(g.vertList)#打印邻接表g.addEdge(0, 1, 5) #给邻接表添加边及权重g.addEdge(0, 5, 2) g.addEdge(1, 2, 4) g.addEdge(2, 3, 9) g.addEdge(3, 4, 7) g.addEdge(3, 5, 3) g.addEdge(4, 0, 1) g.addEdge(5, 4, 8) g.addEdge(5, 2, 1) for v in g: #循环每个顶点for w in v.getConnections(): #循环每个顶点的所有邻居节点print("(%s, %s)" % (v.getId(), w.getId())) #打印顶点和其邻居节点的键

    结果为:

    {0: <__main__.Vertex object at 0x00000000021BF828>, 1: <__main__.Vertex object at 0x00000000021BF860>, 2: <__main__.Vertex object at 0x00000000021BF898>, 3: <__main__.Vertex object at 0x00000000021BF8D0>, 4: <__main__.Vertex object at 0x00000000021BF908>, 5: <__main__.Vertex object at 0x00000000021BF940>}
    (0, 1)
    (0, 5)
    (1, 2)
    (2, 3)
    (3, 4)
    (3, 5)
    (4, 0)
    (5, 4)
    (5, 2)

    python图的邻接表表示

    我就废话不多说了,上代码

    """图的邻接表表示""" class GraphNode(object):    """节点类"""    def __init__(self,_elem=None):        self._elem = _elem # 数据域        self._next = None # 指针域  class Graph(object):    """图类"""    def __init__(self):        """初始化一个序列"""        self._graph = []     def createPeak(self,newNode):        """创建一个图顶点"""        self._graph.append(newNode)        return self._graph     def createSide(self):        """创建图的边"""        for node in self._graph:            graphNode = node            print(f"请输入{graphNode._elem}的邻接点,以-1结束")            while True:                _graphNode = GraphNode() # 初始化每个节点的邻接点                end = input("请输入: ")                if end == '-1':                    self.printGraph()                    break                else:                    """临时列表图中的节点值,用来后续判断"""                    temp = []                    for item in self._graph:                        temp.append(item._elem)                    if end not in temp:                        """输入的邻接节点不在顶点中"""                        print("输入的节点不属于图中的顶点,重新输入")                        continue                    elif end == graphNode._elem:                        """输入的顶点就是当前顶点"""                        print("输入的是当前节点,重新输入")                        continue                    else:                        # 新建节点                        _graphNode._elem = end                        # 指针向后移                        _graphNode._next = graphNode._next                        graphNode._next = _graphNode                        graphNode = graphNode._next     def printGraph(self):        """遍历当前节点列表"""        for node in self._graph:            print(f"顶点{node._elem}的邻接链表: ",end='')            while node != None:                if node._next != None:                    print(f'{node._elem}-->',end='')                else:                    print(f'{node._elem}', end='')                node = node._next            print() # 换节点,换行  if __name__ == '__main__':    count = int(input('请输入顶点个数: '))    s = Graph()    # 创建节点    peakNodeStr = input('请输入顶点: ')    peakNodes = peakNodeStr.split(' ')    # 将输入的节点实例化之后添加到图的链表中    for peakNode in peakNodes:        peak = GraphNode(peakNode)        s.createPeak(peak)     print('图中的节点:',end='')    for peak in s._graph:        print(peak._elem,end=' ')    print()     # 创建边    s.createSide()

    到此,关于“Python怎么自定义邻接表图类”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: Python怎么自定义邻接表图类

    本文链接: https://lsjlt.com/news/347162.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Python怎么自定义邻接表图类
      这篇文章主要介绍“Python怎么自定义邻接表图类”,在日常操作中,相信很多人在Python怎么自定义邻接表图类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么自定义邻接表图类”的疑惑有所帮助!...
      99+
      2023-07-04
    • Python如何自定义邻接表图类
      目录Python自定义邻接表图类图抽象数据类型(ADT)的术语邻接矩阵和邻接表的优缺点自定义顶点类python图的邻接表表示总结Python自定义邻接表图类 图抽象数据类型(ADT)...
      99+
      2022-12-16
      Python邻接表图类 自定义邻接表图类 Python邻接表
    • Java怎么用邻接表存储图
      本篇内容主要讲解“Java怎么用邻接表存储图”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么用邻接表存储图”吧!一、点睛邻接表是图的一种链式存储方法,其数据结构包括两部分:节点和邻接点...
      99+
      2023-07-02
    • Python怎么自定义类继承threading.Thread
      这篇文章主要介绍了Python怎么自定义类继承threading.Thread,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python的五大特点是什么python的五大特点...
      99+
      2023-06-14
    • 怎么在Python中自定义元类
      这期内容当中小编将会给大家带来有关怎么在Python中自定义元类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、lon...
      99+
      2023-06-14
    • 怎么在python中自定义异常类
      这篇文章将为大家详细讲解有关怎么在python中自定义异常类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对...
      99+
      2023-06-14
    • Python 中怎么自定义基本类型
      本篇文章为大家展示了Python 中怎么自定义基本类型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我们也知道,在 Python 里面,一切都是对象,而对象一般有方法。所以,大家会看到下面这种写法:...
      99+
      2023-06-16
    • python怎么实现自定义异常类
      本篇内容介绍了“python怎么实现自定义异常类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明通常可以继承Exception或子类。命名...
      99+
      2023-06-30
    • Python导入自定义类
      现有自定义类(Color.py)如下,类位于路径’/Users/chuxing/python/test’下: class Color(object): def __init__(self, red, green, blu...
      99+
      2023-01-31
      自定义 Python
    • C++中怎么自定义类
      这篇文章将为大家详细讲解有关C++中怎么自定义类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。/////////////TestClass.h/////////////////// &nbs...
      99+
      2023-06-17
    • python多线程怎么自定义线程类
      这篇文章主要介绍python多线程怎么自定义线程类,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float(...
      99+
      2023-06-14
    • win10怎么自定义图标
      这篇文章将为大家详细讲解有关win10怎么自定义图标,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。win10自定义图标的方法首先需要找到进行修改的文件夹,右击文件夹选择属性。进入后切换为自定义选项,点击更...
      99+
      2023-06-10
    • Echarts怎么自定义图形
      本篇内容主要讲解“Echarts怎么自定义图形”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Echarts怎么自定义图形”吧!1.自定义图形最后的效果是这样的:图形由三个面组成,需要定义三个形状...
      99+
      2023-07-05
    • Python如何自定义元类
      这篇文章主要介绍了Python如何自定义元类,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、说明一个类没有声明自己的元类,默认他的元类就是type,除了使用元类type,用...
      99+
      2023-06-14
    • Python 自定义类的排序
      Python 里面自定义类的时候, 一般需要重写几个方法, __init__ 一般是构造函数 这里面有一个__cmp__() 是比较函数, 重写它的时候,一定要记得返回值有三个,0,±1  !! 而不是返回0,1   这里没有注意,导致在...
      99+
      2023-01-31
      自定义 Python
    • python中类怎么定义
      这篇文章主要介绍了python中类怎么定义,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。类的定义# class是定义类的关键字,ClassName为类的名称clas...
      99+
      2023-06-25
    • Android开发怎么自定义实时图表控件
      本文小编为大家详细介绍“Android开发怎么自定义实时图表控件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android开发怎么自定义实时图表控件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。演示环境开发工...
      99+
      2023-07-02
    • VB.NET中怎么自定义类型
      VB.NET中怎么自定义类型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。VB.NET自定义类型在VB.NET中称为“structure”(结构),包含有一个或多个不同种类的数...
      99+
      2023-06-17
    • vue使用highcharts自定义仪表盘图表
      使用highchart图表框架实现一个自定义的类似下图的图表,供大家参考,具体内容如下 1. 原理 实际上就是4个饼图叠起来(可以这么理解),中间一个完整的圆和三个大小不一的圆圈 ...
      99+
      2024-04-02
    • python 自定义异常类学习
      #自定义异常类 class MyException(Exception): pass def exextp_01(): try: #come code here list = ['java...
      99+
      2023-01-31
      自定义 异常 python
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作