如何为Python双向链表实现列表推导式与for-in循环支持
让Python双向链表支持for-in循环与列表推导
核心思路
要让自定义类支持迭代操作(包括for-in循环、列表推导),只需实现Python迭代协议中的__iter__()方法,该方法需返回一个迭代器对象。最简洁的实现方式是用生成器函数来完成。
完整实现代码
基础双向链表结构(含迭代支持)
class Node: def __init__(self, data): self.data = data self.prev = None self.next = None class DoublyLinkedList: def __init__(self): self.head = None self.tail = None def add(self, data): new_node = Node(data) if not self.head: self.head = new_node self.tail = new_node else: self.tail.next = new_node new_node.prev = self.tail self.tail = new_node # 实现迭代协议核心方法 def __iter__(self): current = self.head while current: yield current.data current = current.next
测试验证
# 初始化链表并添加元素 dll = DoublyLinkedList() for num in [10, 20, 30, 40]: dll.add(num) # 测试for-in循环遍历 print("for-in循环遍历结果:") for item in dll: print(item) # 测试列表推导转换 doubled_list = [x * 2 for x in dll] print("\n列表推导转换结果:", doubled_list)
预期输出
for-in循环遍历结果: 10 20 30 40 列表推导转换结果: [20, 40, 60, 80]
关键说明
__iter__()方法是迭代协议的入口,Python在执行for-in或列表推导时会自动调用该方法。- 生成器通过
yield关键字逐个返回元素,当current指向None(链表末尾)时,生成器自动抛出StopIteration异常,Python捕获后终止迭代。 - 该实现无需额外定义独立的迭代器类,代码简洁且符合Python惯用写法。
内容的提问来源于stack exchange,提问作者Debaditya Nath
相关产品推荐
相关产品推荐

