【问题标题】:LinkedList object is not iterable - Python - 'LinkedList' object is not iterableLinkedList 对象不可迭代 - Python - “LinkedList”对象不可迭代
【发布时间】:2021-02-08 00:50:48
【问题描述】:
class Node():
    def __init__(self, val, next=None):
        self.val = val
        self.next = next
        
        
    def __str__(self):
        return self.val
    
    
class LinkedList():
    def __init__(self):
        self.head = None
        
    
    def __repr__(self):
        node = self.head
        nodes = []
        while node is not None:
            nodes.append(node.val)
            node = node.next
        nodes.append("None")
        return "->".join(nodes)
    
    
    def add_first(self, node):
        if not self.head:
            self.head = node
        else:
            node.next = head
            self.head = node
    
    def add_last(self, node):
        if not self.head:
            self.head = node
            return
        else:
            curr = self.head
            while curr.next != None:
                curr = curr.next
            curr.next = node
            
    def add_before(self, target_data, node):
        if self.head.val == target_data:
            node.next = head
            self.head = node
        else:
            prev_node = self.head
            for node in self:
                if node.val == target_data:
                    prev_node.next = new_node
                    new_node.next = node
                    return
                prev_node = node
            

if __name__ == "__main__":
    llist = LinkedList()

    first = Node('a')
    llist.head = first

    second = Node('b')
    first.next = second

    third = Node('c')

    print(llist)
    llist.add_last(third)

    print(llist)
    llist.add_before("b", Node('d'))
    
    print(llist)

错误:对于自身中的节点: TypeError: 'LinkedList' 对象不可迭代

有人可以帮我理解这个问题以及如何解决它吗? 试图理解并解决问题

【问题讨论】:

  • 始终发布完整的错误消息,包括堆栈跟踪。不要让我们猜测错误发生在哪里,堆栈跟踪会告诉我们确切的位置
  • 但是,您希望for node in self: 做什么?为什么?

标签: python linked-list


【解决方案1】:

这是违规行:

for node in self:

这会尝试迭代对象实例,但您尚未为 LinkedList 类定义此行为。

Python 中的所有可迭代对象都必须定义 __iter__() 方法。 Python wiki 有more details on this,以及可迭代和迭代器的区别。

如果您实际上需要此 LinkedList 类的此行为,则应使用适当的逻辑实现 __iter__() 方法。

【讨论】:

  • 不,您几乎可以肯定不应该实现__next__。容器几乎总是可迭代,但它们几乎从来都不是迭代器。
  • @juanpa.arrivillaga 好点。我会相应地编辑我的答案。
  • 谢谢@AndrewGuy。我得到了我的解决方案。我添加了以下代码,它工作 def __iter__(self): node = self.head while node is not None: yield node node = node.next
猜你喜欢
  • 2014-04-26
  • 2021-12-13
  • 2013-12-01
  • 2015-04-14
  • 2022-07-01
  • 2022-09-30
  • 2015-01-22
  • 2019-02-10
  • 2015-04-06
相关资源
最近更新 更多