Двумерный массив в очереди приоритетов в Python - PullRequest
1 голос
/ 22 марта 2019

Мне нужно создать что-то вроде этого:

_______
|A: 15|
|A: 45|
|D: 55|
|A: 45|
|D: 65|
 (...)

как если бы он имел массив из двух позиций (или словарь), где «А» связано с одним значением, а «D» - с другим. И они будут помещены в очередь, которая будет позже заказана. Часть создания, помещения в очередь, получения событий и других вещей, которые я уже нашел и представляю ниже:

class PriorityQueue(object): 
    def __init__(self): 
        self.queue = [] 

    def __str__(self): 
        return ' '.join([str(i) for i in self.queue]) 

    # for checking if the queue is empty 
    def isEmpty(self): 
        return len(self.queue) == [] 

    # for inserting an element in the queue 
    def insert(self, data): 
        self.queue.append(data) 

    # for popping an element based on Priority 
    def delete(self): 
        try: 
            max = 0
            for i in range(len(self.queue)): 
                if self.queue[i] < self.queue[max]: 
                    max = i 
            item = self.queue[max] 
            del self.queue[max] 
            return item 
        except IndexError: 
            print() 
            exit() 

Я тестировал его несколько раз, и он действительно сортируется, и я могу получить значения с приоритетом, но я не знаю, как поместить значения, связанные со строкой 'A' или 'D'. Это вообще возможно в питоне?

Представленный код может поместить данные в очередь следующим образом:

myQueue = PriorityQueue() 
myQueue.insert(12) 
myQueue.insert(1) 
myQueue.insert(14) 
myQueue.insert(7) 
print(myQueue)             
while not myQueue.isEmpty(): 
    print(myQueue.delete()) 

Мне нужно это, чтобы принимать события с самым низким приоритетом и проверять, является ли это 'A' или 'D'

1 Ответ

0 голосов
/ 29 марта 2019

Взгляните на следующий код (Python 3):

class PriorityQueue(object):
    def __init__(self):
        self.queue = []
    def __str__(self):
        return "\n".join(["\n".join(["{0}: {1}".format(key, pair[key]) for key in pair]) for pair in self.queue])
    # for checking if the queue is empty
    def isEmpty(self):
        return len(self.queue) == 0
    # for inserting an element in the queue
    def insert(self, data):
        if (type(data) == dict) and (len(data) == 1):
            new_key = list(data.keys())[0]
            if (type(new_key) == str) and (type(data[new_key]) == int):
                self.queue.append(data)
    # for popping an element based on Priority
    def delete(self):
        if self.isEmpty():
            return [None, None]
        max_index = None
        max_int = None
        max_key = None
        for i in range(len(self.queue)):
            pair_key = list(self.queue[i].keys())[0]
            pair_int = self.queue[i][pair_key]
            if (max_index == None) or (pair_int < max_int):
                max_index = i
                max_int = pair_int
                max_key = pair_key
        del self.queue[max_index]
        return [max_key, max_int]

def main():
    myQueue = PriorityQueue()
    myQueue.insert({"A": 15})
    myQueue.insert({"A": 45})
    myQueue.insert({"D": 55})
    myQueue.insert({"A": 35})
    myQueue.insert({"D": 65})
    myQueue.insert({"D": -10})
    print(myQueue)
    while not myQueue.isEmpty():
        key, value = myQueue.delete()
        if key:
            print("Delete {0} associated to {1}".format(value, key))

Каждая вставка получает пару строка + int (она поддерживает также отрицательные значения)

Выход:

A: 15
A: 45
D: 55
A: 35
D: 65
D: -10
Delete -10 associated to D
Delete 15 associated to A
Delete 35 associated to A
Delete 45 associated to A
Delete 55 associated to D
Delete 65 associated to D
...