【问题标题】:how to code linked list in python with multiple variables如何在python中使用多个变量编写链表
【发布时间】:2014-01-31 18:50:54
【问题描述】:

我对python有点陌生。我的背景更多是 Java 和 C++。我正在尝试创建一个包含多个变量的链表。我知道它可以用 Java 和 C++ 完成,但我不确定如何用 python 设置它。现在我有在其他网站上找到的使用单个变量的代码,但我需要它来保存几条信息。我现在拥有的是:

 class Node:
     def __init__(self, cargo=None, next=None):
         self.cargo = cargo
         self.next  = next

     def __str__(self):
         return str(self.cargo)

这没关系,但我需要更多信息然后这个。使用 C++,我可以在结构中放置任意数量的变量。有人可以告诉我我需要对此进行哪些更改,以便我可以使用许多数据。例如:电影名称、评分、类型等。 (不是项目只是示例)。该项目的目标是将两个非常非常大的列表相互比较。或者也许有人有更有效的方法来做到这一点。我很想听听。

提前致谢

【问题讨论】:

  • 您当前的代码如何阻止您使用多条数据?只需创建一个对象或字典或包含您想要的所有信息的东西,并将其用作“货物”。
  • 我只是不确定如何设置它。
  • 您的 Node 类不需要更改即可存储许多数据。你只是问如何在 Python 中创建一个类?
  • 在这种情况下是的。我将如何设置一个类以将多条数据用于链表?

标签: python linked-list


【解决方案1】:

Python 使用一种叫做“鸭子打字”的东西。如果一个物体像鸭子一样走路,像鸭子一样叫,那么它就是鸭子。将“walk”和“quack”视为对象方法。只要对象上存在这些方法,就可以调用它们。所以你的货物可以是任何东西,只要你调用的所有方法实际上都存在于它上面。

一个可能有帮助的 Java 类比是,如果您只是将 Node.cargo 想象为基 Object 类,并且在代码中的其他位置,您可能会在调用方法之前显式地转换它。如果强制转换失败,那么你会得到一个异常。与 Python 的不同之处在于您不会在调用方法之前进行强制转换,而是仅检查对象上是否存在该方法(也就是说,它是否像鸭子一样走路)。

所以在这个例子中,如果我们设置一堆支持 len() 函数的节点,然后遍历这些节点,一切都很好:

node3 = Node('last')
node2 = Node(['m', 'i', 'd'], node3)
node1 = Node(('fir', 'st'), node2)

def visit_all(node):
    while node:
         print(type(node.cargo), node, len(node.cargo))
         node = node.next

>>> visit_all(node1)
 <class 'tuple'> ('fir', 'st') 2
 <class 'list'> ['m', 'i', 'd'] 3
 <class 'str'> last 4

但是,如果我们尝试传入不支持 len() 的节点,则会收到一个异常,类似于 Java ClassCastException。

node0 = Node(0, node1)

>>> visit_all(node0)
 TypeError: object of type 'int' has no len()

综上所述,如果您想将电影标题、评级、流派等组合在一起,那么您可能会将它们存储在单独的类中,而不是在 Node.js 中。如果您的分组数据是不可变的,您还可以考虑使用命名元组。同样,将 cargo 视为一个 Java 对象,您不必在调用其方法或属性之前显式转换。

编辑: OP 请求了一个让 Node 存储自定义类的明确示例。

class Movie(object):
    def __init__(self, title, rating, actors):
        self.title = title
        self.director = director
        self.actors = actors

node = Node('Some Movie', 'PG', ('John Doe', 'Jane Doe'))

>>> print(node.cargo.title)
 Some Movie

或者如果 Movie 类可以是不可变的:

from collections import namedtuple

Movie = namedtuple('Movie', ['title', 'rating', 'actors'])
node = Node('Some Movie', 'PG', ('John Doe', 'Jane Doe'))

>>> print(node.cargo.rating)
 PG

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    相关资源
    最近更新 更多