【问题标题】:Change next list element during iteration?在迭代期间更改下一个列表元素?
【发布时间】:2016-09-09 09:35:17
【问题描述】:

假设您有一个二维空间中的点列表。我正在尝试找到对称点。

为此,我遍历我的点列表并应用对称操作。因此,假设我将其中一个操作应用于第一个点,并且在此操作之后它等于列表中的其他点。这两点是对称的。

所以我想要的是从我正在迭代的列表中删除另一个点,这样我的迭代变量说“i”就不会采用这个值。因为我已经知道它与第一个点是对称的。

我看过类似的帖子,但他们删除了列表中的一个他们已经使用的值。我想要的是删除后续值。

【问题讨论】:

  • 您可以有一个单独的列表或设置维护找到的点,并在每次迭代时检查if not in
  • 请发表您到目前为止所尝试的内容?

标签: python python-2.7 loops iterator


【解决方案1】:

无论对称点是否为真,都将它们添加到集合中,因为集合保持唯一元素并且查找是O(1),如果point not in set 条件,您可以使用。

if point not in s:
    #test for symmetry
    if symmetric:
        s.add(point)

【讨论】:

    【解决方案2】:

    一般来说,从您正在迭代的列表中删除值是一个坏主意。然而,还有另一种方法可以跳过对称点。例如,如果您之前看到过对称点,则可以检查每个点:

    for i, point in enumerate(points):
        if symmetric(point) not in points[:i]:
            # Do whatever you want to do
    

    这里symmetric 根据您的对称操作生成一个点。如果你的对称操作连接两个以上的点,你可以做

    for i, point in enumerate(points):
        for sympoint in symmetric(point):
            if sympoint in points[:i]:
                break
        else:
            # Do whatever you want to do
    

    【讨论】:

    • 这具有线性复杂度。
    • @garg10may 我认为它甚至是二次的,但我不确定是否有更快的方法。最坏的情况是没有对称点,因此对于每个点,您都必须测试整个列表。最好的情况是所有点都是对称的,然后我的解决方案是线性的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2015-04-07
    • 2012-01-23
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多