Добавление нескольких значений ключей в очередь для BFS в python - PullRequest
0 голосов
/ 28 мая 2020

Я реализую BFS в python. Чтобы добавить узлы моего графа в мою очередь, я использую следующие строки кода:

graph = {} graph['you'] = 'Alice','Bob','Claire' search_queue+=graph['you'] Это отлично сохраняет мои ключевые значения как отдельные элементы в очереди. Однако, если мой ключ имеет одно значение, например, graph['Alice'] = 'Peggy' search_queue+=graph['Alice'], на выходе будет очередь с 'p', 'e', ​​'g', 'g', 'y', сохраненными как отдельные значения. Я знаю, что append () следует использовать для добавления элемента в очередь или список, но мне нужно добавить как несколько, так и отдельные значения для разных ключей. Есть ли способ сделать это иначе? До сих пор я использовал ',' в конце значения, например graph['Alice'] = 'Peggy',, для обработки значения ключа, которое может быть объединено с очередью или списком без потери строки. Но я уверен, что должен быть способ лучше. Вот мой код -

from collections import deque



def congratulations_msg():
    '''message to display success'''
    print('Congratulations, we have found the element')



graph = {}
graph['you'] = 'Alice','Bob','Claire',
graph['Bob'] = 'Anuj','Peggy',
graph['Claire'] = 'Johnny','Thom',
graph['Alice'] = 'Peggy',
graph['Peggy']='you',

# Assign element to be searched 
seller='Thom'


#Create a dequeue to store nodes   
search_queue = deque()


# Initialize queue with values of 'you' key
search_queue+=graph['you']

checked_elements=[]

# Loop while queue is not empty
while search_queue:

    print(search_queue)
    #Check if element in queue already processed
    if  search_queue[0] in checked_elements:
        search_queue.popleft()
        continue
    #Check if queue element is the one that we are looking for
    elif seller == search_queue[0]:
         congratulations_msg()
         break

    else: 
    #Store store processed queue element and add its nodes to the queue
         checked_elements+= search_queue[0],
         popped_element = search_queue.popleft()

         checked_elements+= popped_element
         search_queue+=graph.get(popped_element,'')

1 Ответ

0 голосов
/ 28 мая 2020

Вы можете определить небольшую функцию, которая обрабатывает перечисление правильных значений. Предполагая, что элементы значения представляют собой строку или список строк

def get_values(element):
    if isinstance(element, str):
        # its a string
        return element,
    return element

# usage
search_queue += get_values(graph['alice'])

Если вы не предполагаете, что отдельные элементы являются строками, решение может быть более сложным. Вы можете использовать

>>> from collections.abc import Iterator
>>> isinstance('abc', Iterator)
False
>>> isinstance(('abc',), Iterator)
True

, чтобы проверить, является ли значение вложенным итератором. Но на этом этапе я бы серьезно подумал, если бы типы значений dict не могли быть однородными.

...