Python - возврат комбинации 2 очередей

class Queue:
def __init__(self):
    self.items = []

def isEmpty(self):
    return self.items == []

def enqueue(self, item):
    self.items.append(item)

def dequeue(self):
    if self.items == []:
        raise IndexError('The queue is empty.')
    return self.items.pop()

def size(self):
    return len(self.items)

def __str__(self):
    return "Queue: " + (str(self.items))

def enqueue_list(self, list):
    for i in list:
        self.items.append(i)
    return self.items

def splice(self, second_queue):
    for i in second_queue:
        self.items.enqueue(i)
    return self.items

Всем привет,

То, что я пытаюсь сделать, находится внизу метода сращивания. Я хочу перебрать вторую очередь и добавить ее в конец исходной. Однако я не могу понять, как я могу перебирать очередь, не вызывая ошибки. Должен ли я как-то сначала преобразовать second_queue в список?

Original exception was:
Traceback (most recent call last):
File "prog.python3", line 74, in <module>
my_queue.splice(another_queue)
File "prog.python3", line 28, in splice
for i in second_queue:
TypeError: 'Queue' object is not iterable

Что это за ошибка?

timgeb 29.04.2018 11:33

TypeError: объект Queue не повторяется

verdy 29.04.2018 11:33

Хорошо, добавьте полную трассировку к вашему вопросу и код, который вы используете для его запуска. idownvotedbecau.se/noexceptiondetails тоже может быть полезным.

timgeb 29.04.2018 11:34

Исходное исключение: Traceback (последний вызов последним): файл «prog.python3», строка 74, в <module> my_queue.splice (another_queue), файл «prog.python3», строка 28, в соединении для i в second_queue: TypeError : Объект "Очередь" не повторяется

verdy 29.04.2018 11:36

Хорошо, не могли бы вы отредактировать это прямо в вопросе? Текст, который предполагается форматировать в комментариях, сложно читать.

timgeb 29.04.2018 11:37

Хорошо, но если бы вы могли сказать мне, как перебирать очередь и добавлять ее в другую очередь, было бы здорово

verdy 29.04.2018 11:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
135
1

Ответы 1

Экземпляры вашего класса Queue не повторяются.

Они содержат список items, но Python не знает, что он должен перебирать этот список, когда вы используете цикл for для экземпляра Queue.

Чтобы делегировать итерацию упакованному list, просто добавьте метод

def __iter__(self):
    return iter(self.items)

Демо с фиксированным классом:

>>> q = Queue()
>>> q.enqueue(1)
>>> q.enqueue(2)
>>> q.items
[1, 2]
>>>
>>> for item in q:
...     print(item)
... 
1
2

Еще одна возможность - определение __getitem__.

Alex Hall 29.04.2018 11:42

@AlexHall да, но самописные классы должны использовать __iter__. Прочтите часть 7 этот ответ.

timgeb 29.04.2018 11:44

Другие вопросы по теме