【问题标题】:Ending while loop when a list does not change当列表没有改变时结束while循环
【发布时间】:2016-10-20 20:58:32
【问题描述】:

在 Python 中,有没有一种在列表不变的情况下结束 while 循环的好方法?

我正在尝试实现 k 均值算法,该算法涉及查找数据点组的质心。一旦质心位置不再变化,循环终止。

我知道我可以在循环开始时保存质心列表,然后让 while 循环继续,直到前面的质心与当前的质心匹配。但是有没有更 Pythonic 的方式来做到这一点?

【问题讨论】:

  • Exit while loop in Python的可能重复
  • 我不知道如何解释“Exit while loop in Python”的答案,他们似乎不是在谈论一个不断变化的列表
  • 你不能使用布尔标志has_changed = True,而你的while循环类似于while not has_changed。无论如何,您是否有理由要实现自己的 k-means?
  • 显示循环。并显示列表与循环的关系。

标签: python python-3.x while-loop


【解决方案1】:

该解决方案在空间复杂度方面不是最优的,因为要保留列表的两个副本。但这允许检查列表是否已更改。

from copy import deepcopy


class CList(list):
    def __init__(self, *args, **kwargs):
        super(CList, self).__init__(*args, **kwargs)
        self.reset_state()

    def reset_state(self):
        self_copy = deepcopy(self)
        self.last_state = self_copy

    @property
    def has_changed(self):
        return self.last_state != self

>>> l = CList([1, 2, 3])
>>> l.has_changed
False
>>> l.append(4)
>>> l
[1, 2, 3, 4]
>>> l.has_changed
True
>>> l.reset_state()
>>> l.has_changed
False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2018-04-06
    • 2016-04-10
    相关资源
    最近更新 更多