2015-04-28 5 views
1

Я сделал очередь приоритетов, функции которой используют мои двоичные функции кучи. Однако в моем тестовом файле я пытаюсь распечатать свою очередь, чтобы посмотреть что-то вроде этого.Python: Как настроить функцию __str__ в PriorityQueue

Your queue looks like this: 15 -> 45 -> 10 -> 100 

Где-то подобное, однако он продолжает печатать, где очередь хранится, а не элементов в очереди, пример этого:

<PriorityQueue.PriorityQueue object at 0x01E95530> 

Я дочитал на pythonDocs и пришел к выводу I необходимо str функция. Тем не менее, мне трудно создавать его. Может ли кто-нибудь помочь мне здесь, как это будет выглядеть? Большое спасибо. Вот мой код.

class Heap(object): 

    def __init__(self, items=None): 

     '''Post: A heap is created with specified items.''' 

     self.heap = [None] 
     if items is None: 
      self.heap_size = 0 
     else: 
      self.heap += items 
      self.heap_size = len(items) 
      self._build_heap() 

    def size(self): 

     '''Post: Returns the number of items in the heap.''' 

     return self.heap_size 

    def _heapify(self, position): 

     '''Pre: Items from 0 to position - 1 satisfy the Heap property. 
      Post: Heap Property is satisfied for the entire heap.''' 

     item = self.heap[position] 
     while position * 2 <= self.heap_size: 
      child = position * 2 
      # If the right child, determine the maximum of two children. 
      if (child != self.heap_size and self.heap[child+1] > self.heap[child]): 
       child += 1 
      if self.heap[child] > item: 
       self.heap[position] = self.heap[child] 
       position = child 
      else: 
       break 
     self.heap[position] = item 

    def delete_max(self): 

     '''Pre: Heap property is satisfied 
      Post: Maximum element in heap is removed and returned. ''' 

     if self.heap_size > 0: 
      max_item = self.heap[1] 
      self.heap[1] = self.heap[self.heap_size] 
      self.heap_size -= 1 
      self.heap.pop() 
      if self.heap_size > 0: 
       self._heapify(1) 
      return max_item 

    def insert(self, item): 

     '''Pre: Heap Property is Satisfied. 
      Post: Item is inserted in proper location in heap.''' 

     self.heap_size += 1 
     # extend the length of the list. 
     self.heap.append(None) 
     position = self.heap_size 
     parent = position // 2 
     while parent > 0 and self.heap[parent] < item: 
      # Move the item down. 
      self.heap[position] = self.heap[parent] 
      position = parent 
      parent = position // 2 
     # Puts the new item in the correct spot. 
     self.heap[position] = item 

    def _build_heap(self): 

     ''' Pre: Self.heap has values in 1 to self.heap_size 
      Post: Heap property is satisfied for entire heap. ''' 

     # 1 through self.heap_size. 

     for i in range(self.heap_size // 2, 0, -1): # Stops at 1. 
      self._heapify(i) 

    def heapsort(self): 

     '''Pre: Heap Property is satisfied. 
      Post: Items are sorted in self.heap[1:self.sorted_size].''' 

     sorted_size = self.heap_size 

     for i in range(0, sorted_size -1): 
      # Since delete_max calls pop to remove an item, we need to append a dummy value to avoid an illegal index. 
      self.heap.append(None) 
      item = self.delete_max() 
      self.heap[sorted_size - i] = item 

Выше мой класс Heap, где мой PriorityQueue занимает от: Ниже мой класс PQ и мой тестовый файл.

#PriorityQueue.py 
from MyHeap import Heap 


class PriorityQueue(object): 

    def __init__(self): 
     self.heap = Heap() 

    def enqueue(self, priority, item): 
     '''Post: Item is inserted with specified priority in the PQ.''' 
     self.heap.insert((priority, item)) 
     return item 

    def first(self): 
     '''Post: Returns but does not remove the highest priority item from the PQ.''' 
     return self.heap.size() 


    def dequeue(self): 
     '''Post: Removes and returns the highest priority item from the PQ.''' 
     if self.heap.size() is None: 
      raise ValueError("Error your queue is empty.") 
     x = self.first() 
     self.heap.delete_max() 
     return x 

    def size(self): 
     '''Post: Returns the number of items in the PQ.''' 
     return self.heap.size() 

from PriorityQueue import PriorityQueue 

PQ = PriorityQueue() 


print(PQ.enqueue(1, 10)) 
print(PQ.enqueue(2, 5)) 
print(PQ.enqueue(3, 90)) 
print PQ 
print(PQ.size()) 

EDIT: Я пытался сделать следующее:

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

This выводит только это:

<MyHeap.Heap object at 0x01E255F0> 
+0

Для выбора из которых один использовать, см HTTP://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-python. В этом случае вы, вероятно, хотите '__str__'. – augurar

+0

@augurar Теперь я вижу, почему я буду использовать '__str__', как бы я хотел вставить это в мой класс PQ? – Rookie

+0

Мой ответ ниже дает более ** прямой ** ответ, хотя он не будет предоставлять причудливые '->' соединения. И только для записи, решение @ rickcnagy имеет ошибку. :-) – lifebalance

ответ

2

Хорошо, идея __str__ заключается в возвращает некоторую строку, представляющую объект в человеке-r удобный способ. Вы должны построить строку, а затем все, что вы вернетесь будет печататься вместо

<PriorityQueue.PriorityQueue object at 0x01E95530> 

В вашем случае, мы должны вернуть пункты self.heap.heap, разделенных ->. Это будет работать, чтобы получить выход, как вы описали:

def __str__(self): 
    if self.size(): 
     heap_items = [str(i) for i in self.heap.heap if i] 
     heap_items_str = ' -> '.join(heap_items) 
     return "Your queue looks like this: {}".format(heap_items_str) 
    else: 
     return "Your queue is empty." 

Обратите внимание, что мы используем self.heap.heap, не self.heap потому self в этом случае является PriorityQueue экземпляром, и PriorityQueue имеет .heap свойства, содержащий Heap. Это Heap, что мы на самом деле хотим назвать .heap, что в свою очередь дает нам список, который мы собираемся сделать.

+0

Не должен ли '' '' 'self.heap'' (вместо' self.heap.heap')?. – lifebalance

+0

@lifebalance нет, я уверен, что это должно быть 'self.heap.heap'. Это потому, что 'self' в этом случае является экземпляром' PriorityQueue', а 'PriorityQueue' имеет свойство' .heap', которое содержит 'Heap'. Именно эту «кучу» мы на самом деле хотим называть «.heap», которая в свою очередь дает нам список, который мы собираемся сделать. Имеет ли это смысл? – rickcnagy

0

EDIT: Я пытался сделать следующее:

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

Вместо этого, попробуйте это:

def __str__(self): 
    return self.heap.__str__() 
Смежные вопросы