链接列表中的类不起作用

时间:2017-12-22 07:08:01

标签: python class linked-list

做了一个功课,要做两个班级的陈列室:Car&节点,而Node数据包含Car类及其数据。然后我必须制作一个链接列表,应该加倍,但我认为一个简单应该也可以,包含汽车的节点。链接列表中唯一的功能是插入一个带有新Car的新节点。它应按汽车价格向上排序。

试过这个,但它一直告诉我

  

TypeError:'<' 'NoneType'和'NoneType'实例之间不支持

=====================================
| id | userid | item_id    | rating |
=====================================
| 1  |   1    |     B      |   5    |
| 2  |   1    |     C      |   4    |
| 3  |   2    |     A      |   4    |
| 4  |   2    |     C      |   3    |
| 5  |   3    |     A      |   2    |
| 5  |   3    |     B      |   2    |
| 6  |   3    |     C      |   2    |
=====================================

我错过了什么,因为我认为它应该有用。

2 个答案:

答案 0 :(得分:0)

Node.__init__中,您拥有使用默认值(全部为self.data = Car())创建Car实例的行None。这意味着列表中每个Car的价格都是None。之后,当您尝试将价格与newNode.data.price < curNode.data.price进行比较时,您会收到例外情况,因为您无法比较None值。

您可能需要将self.data = Car()替换为其他内容。对于我来说,汽车数据应该来自哪个代码或者它的格式是什么,这对我来说并不明显。如果cars序列在顶级init重复迭代Car 1}} function已经是self.data = data个实例的列表,那么您可能只需在Node.__init__中执行Car。否则,您需要执行其他操作来提取汽车数据并将其传递给Car.__init__构造函数。您可能还想考虑删除rrr=[[(1,(3,1)),(2, (3,2)),(3, (3, 2)),(1,(4,1)),(2, (4,2))]] df_input = [] 的默认参数,因为创建没有它们的汽车似乎没有多大意义。

答案 1 :(得分:0)

我在代码中看到了一些问题,主要是关于类型一致性。您应该重新考虑这里的类结构究竟应该做什么,如何设置默认值等。另外:您是否希望将下一个节点变量作为另一个节点?

假设如下:我们有汽车。每辆车都有名称,品牌和价格。我们希望通过Node连接两辆车。我们需要能够容纳节点并允许我们插入新节点的列表。应该进行插入,使得节点层次结构以递增的价格值连接汽车。两个相邻节点共享一辆汽车。您可以将其写为:

class Car:
    def __init__(self, name = " ", brand = " ", price = 0):
        self.name = name
        self.brand = brand
        self.price = price

class Node:
    def __init__(self,car1,car2):
        assert type(car1) == type(car2) == Car
        if car1.price > car2.price:
            self.next = car1
            self.current = car2
        else:
            self.next = car2
            self.current = car1

class LinkedList:
    def __init__(self,firstnode):
        self.ListOfNodes = [firstnode]

    def insertNode(self, car):
        for i in range(0,len(self.ListOfNodes)):
            curnod = self.ListOfNodes[i]
            newnod = Node(car,car)
            if  car.price < curnod.current.price: 
                if i<len(self.ListOfNodes): #If its not the last node
                    newnod.next = curnod.current
                if i>0: #If its not the first node, i.e. it has a predecessor
                    ListOfNodes[i-1].next = newnod.current
                self.ListOfNodes.insert(i,newnod)
                return
            elif car.price < curnod.next.price: 
                newnod.current = curnod.current
                curnod.current = car 
                self.ListOfNodes.insert(i,newnod)
                return
        newnod.current = self.ListOfNodes[-1].next #this is only reached if the price is higher than all before
        self.ListOfNodes.append(newnod)




car1 = Car(name = "baby",brand= "honda", price = 1000)
car2 = Car(name = "yomomma",brand= "Benz", price = 10)
car3 = Car(name = "PussyWagon",brand= "Dodge", price = 100)
car4 = Car(name = "FakeTaxi",brand= "HellNah", price = 10000000)
car5 = Car(name = "LondonTaxi",brand= "ChumBucket", price = 1)
p = Node(car2,car1)
lst = LinkedList(p)
lst.insertNode(car3)
lst.insertNode(car4)
lst.insertNode(car5)

它非常通用但它应该有用。