【发布时间】:2017-07-04 16:54:21
【问题描述】:
counter = Counter()
// fill data into counter
for a, b in counter.most_common():
if (b > 1):
counter[a] = np.log(b)
else:
counter[a] = -np.log((1 / (b+0.01)))
如我所见,根据我的试验,这是安全的。当我在枚举集合时更改集合,不会发生任何坏事。在其他语言中,在for 的每个循环中,都会评估counter.most_common() 的值。
这在 Python 中不也会发生吗?
【问题讨论】:
-
“在其他语言中,在 for 的每个循环中,都会评估 counter.most_common() 值”- 什么语言会这样做?我一个都不知道。在我所知道的每一种带有 for-each 循环的语言中,你循环的东西只会被评估一次。
-
或者简而言之:不要将 for-each 与 C 风格的
for循环混淆。我所知道的所有具有 for-each 循环的语言,都会在开始时评估一次迭代。与例如的区别Java 迭代器是.most_common()返回一个不引用原始计数器的新列表。 -
您可能会想到循环遍历根据需要生成值的惰性对象的情况,或者您可能会误认为改变集合的效果是重新评估它,但
most_common急切地创建一个独立于创建它的计数器的新列表。 -
不允许在迭代期间修改
set,但这也会引发RuntimeError:RuntimeError: Set changed size during iteration。由于您的操作不会改变计数器的大小,也不会引发异常,因此我认为它是安全的。 -
most_common()在调用时返回 n 个最常见元素的列表,即在for循环的开头一次。返回的值可能不再是当前最常见的值,因为您正在更改循环内的Counter对象。如果您愿意 edit 您的问题并解释您最终想要实现的目标,您可能会提出替代方案或解决方法。
标签: python collections enumeration