是否有在python循环中引用迭代器变量名称的pythonic方法?

问题描述 投票:1回答:2

下面是代码段:

# 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
2个回答
0
投票

我认为您正试图以一种尴尬的方式推广此代码。我会给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)

0
投票

[当您执行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>
© www.soinside.com 2019 - 2024. All rights reserved.