简体   繁体   中英

Python: Remove last value in dataclass instance

Dataclasses:

@dataclass
class Node:
     value: int = None
     nxt: Any = None


@dataclass
class Deque:
    head: Node = None
    tail: Node = None
    size: int = 0

The values:

self.head = Node(value=19, nxt=Node(value=18, nxt=Node(value=17, nxt=Node(value=16, nxt=Node(value=15, nxt=Node(value=14, nxt=Node(value=13, nxt=Node(value=12, nxt=Node(value=11, nxt=Node(value=1, nxt=Node(value=2, nxt=Node(value=3, nxt=Node(value=4, nxt=Node(value=5, nxt=Node(value=6, nxt=Node(value=7, nxt=Node(value=8, nxt=Node(value=9, nxt=Node(value=10, nxt=None)))))))))))))))))))

self.tail = Node(value=10, nxt=None)

I want to remove the tail from the head with the following function:

    def remove_last(self):
    if self.tail is None:
        return str(None)
    else:
        _node = self.head
        _remove = self.tail
        print(_remove)

So i get the result:

self.head = Node(value=19, nxt=Node(value=18, nxt=Node(value=17, nxt=Node(value=16, nxt=Node(value=15, nxt=Node(value=14, nxt=Node(value=13, nxt=Node(value=12, nxt=Node(value=11, nxt=Node(value=1, nxt=Node(value=2, nxt=Node(value=3, nxt=Node(value=4, nxt=Node(value=5, nxt=Node(value=6, nxt=Node(value=7, nxt=Node(value=8, nxt=Node(value=9, None))))))))))))))))))

In order to remove the tail from your dequeue, you need to clear the nxt attribute from its second-last entry. Since your Node s are uni-directional, you need to first find that second-last one. I also called it pop and made it return the item that was removed, since that is the usual data-structure-pattern, and added some more stuff in order to have something that could actually be shown:

# importing this makes it possible to do self-referential type annotation in `Node`
from __future__ import annotations

from dataclasses import dataclass
from typing import Optional


@dataclass
class Node:
    value: int
    nxt: Optional[Node] = None


@dataclass
class Deque:
    head: Optional[Node] = None
    tail: Optional[Node] = None
    size: int = 0

    def add(self, node: Node):
        if self.size == 0:
            self.head = self.tail = node
            self.size = 1
        else:
            node.nxt = self.head
            self.head = node
            self.size += 1

    def pop(self) -> Node:
        if self.size == 0:
            raise ValueError("Deque is empty.")
        if self.size == 1:
            old_tail = self.tail
            self.head = self.head.next = self.tail = None
        else:
            current = self.head
            while current.nxt is not self.tail:
                current = current.nxt
            old_tail = current.nxt
            self.tail = current
            current.nxt = None

        self.size -= 1
        return old_tail

Demonstration:

>>> dq = Deque()
>>> dq.add(Node(0))
>>> dq.add(Node(1))
>>> dq.add(Node(2))
>>> dq
Deque(head=Node(value=2, nxt=Node(value=1, nxt=Node(value=0, nxt=None))), tail=Node(value=0, nxt=None), size=3)
>>> dq.pop()
Node(value=0, nxt=None)
>>> dq
Deque(head=Node(value=2, nxt=Node(value=1, nxt=None)), tail=Node(value=1, nxt=None), size=2)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM