【问题标题】:Is there a pythonic way of referring to the iterators variable names inside of the for loop?是否有一种 Pythonic 方式来引用 for 循环内的迭代器变量名称?
【发布时间】:2020-03-25 20:41:05
【问题描述】:

下面是代码sn-p:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

...

val = carry
for l in filter(None, [l1, l2]):
    val += l.val
    l = l.next

l1 和 l2 是两个链表。如果列表为空,则将其设置为 None,这样循环仅在未完全遍历时才处理链表。我想使用循环来防止代码重复。 问题出在第四行,在循环迭代时,l1 或 l2 都不会更新为列表的下一个节点,而是 l 是。 有谁知道解决此问题的任何好模式?抱歉,如果以前有人问过这个问题,但我不知道寻找答案的正确术语。也许定义一个单独的函数或匿名函数是最好的方法?

【问题讨论】:

    标签: python design-patterns syntax


    【解决方案1】:

    当您执行l = l.next 之类的操作时,您只是在更改名称l 的位置 指着。如果您制作一个包装列表节点的链表类,您将 能够改变链表对象,而不参考你的名字 之前分配给它。

    我添加了一些用于演示的方法。

    class ListNode:
        def __init__(self, x, next=None):
            self.val = x
            self.next = next
    
        @classmethod
        def from_values(cls, values):
            try:
                first_val = next(values)
                return cls(first_val, cls.from_values(values))
            except StopIteration:
                return None
    
        def __iter__(self):
            yield self.val
            if self.next is not None:
                yield from self.next
    
    class LinkedList:
        def __init__(self, values):
            self.head = ListNode.from_values(iter(values))
    
        def __bool__(self):
            return bool(self.head)
    
        def __str__(self):
            if self.head is None:
                return "<>"
            return "<{}>".format(", ".join(str(i) for i in self.head))
    
    l1 = LinkedList([])
    l2 = LinkedList([1, 2, 3])
    print(l1)
    print(l2)
    for l in filter(None, [l1, l2]):
        l.head= l.head.next
    print(l1)
    print(l2)
    

    有输出:

    <>
    <1, 2, 3>
    <>
    <2, 3>
    

    【讨论】:

      【解决方案2】:

      我认为您试图以一种尴尬的方式概括此代码。我会给ListNode 一个__iter__ 方法(或类似的方法),然后就使用它:

      class ListNode:
          def __init__(self, x):
              self.val = x
              self.next = None
      
          def __iter__(self):
              cur_node = self
      
              while cur_node:
                  yield cur_node.val
                  cur_node = cur_node.next
      

      完成此操作并可以迭代列表节点后,您只需将l1l2 传递给sum

      l1_sum = sum(l1)
      l2_sum = sum(l2)
      

      【讨论】:

        猜你喜欢
        • 2012-02-15
        • 2021-03-22
        • 1970-01-01
        • 2017-01-10
        • 2016-01-12
        • 1970-01-01
        • 2018-12-29
        • 2018-04-07
        • 1970-01-01
        相关资源
        最近更新 更多