Python:如何每 'n' 次迭代做一些事情,但只使用以前的 'm' 值?
Python: How to do something every 'n' iterations but only with the previous 'm' values?
我正在尝试收集 Collatz 猜想的统计数据。目前,我的脚本获取从 2 开始到较大的预设数字的每个数字的 Collatz 序列的长度,并将该长度保存到一个不断增长的数组中。每 100 次迭代,它会从 all 之前的数据中收集一些统计数据,并将它们保存到这样的字典中:
result = []
data = {}
for count, v in enumerate(range(2, 10000000), 1):
if count % 100 == 0:
result.append(len(collatz_concise(count))-1)
Max = round(max(result), 2)
Min = round(min(result), 2)
Mean = round(sum(result) / len(result))
Median = round(statistics.median(result))
Range = round(Max - Min, 2)
Trim_Mean = round(stats.trim_mean(result, 0.1), 2)
stat = np.array(result)
Q1 = round(np.percentile(stat, 25), 2)
Q3 = round(np.percentile(stat, 75), 2)
data[count] = [Min, Q1, Median, Mean, Trim_Mean, Q3, Max]
我希望每 100 次收集一次统计信息,但仅收集列表的前 100 个值。我环顾四周但找不到合适的答案。
温柔一点,我在这方面和 Whosebug 上都是新手。
周期性动作
执行每 n 个步骤的方法是对 n 取模并检查它是否为零.
跟踪最近的值
跟踪 m 最近值的最简单方法是使用 collections.deque() 并将 maxlen 参数设置为 m.
方法概述
这里有一些代码可以帮助您入门:
>>> n = 15
>>> m = 20
>>> result = deque(maxlen=m)
>>> for i in range(100):
c = collatz(i)
result.append(c)
if i % n == 0:
print(i, '-->', result)
这是输出:
0 --> deque([0], maxlen=20)
15 --> deque([0, 4, 1, 10, 2, 16, 3, 22, 4, 28, 5, 34, 6, 40, 7, 46], maxlen=20)
30 --> deque([34, 6, 40, 7, 46, 8, 52, 9, 58, 10, 64, 11, 70, 12, 76, 13, 82, 14, 88, 15], maxlen=20)
45 --> deque([13, 82, 14, 88, 15, 94, 16, 100, 17, 106, 18, 112, 19, 118, 20, 124, 21, 130, 22, 136], maxlen=20)
60 --> deque([124, 21, 130, 22, 136, 23, 142, 24, 148, 25, 154, 26, 160, 27, 166, 28, 172, 29, 178, 30], maxlen=20)
75 --> deque([28, 172, 29, 178, 30, 184, 31, 190, 32, 196, 33, 202, 34, 208, 35, 214, 36, 220, 37, 226], maxlen=20)
90 --> deque([214, 36, 220, 37, 226, 38, 232, 39, 238, 40, 244, 41, 250, 42, 256, 43, 262, 44, 268, 45], maxlen=20)
我正在尝试收集 Collatz 猜想的统计数据。目前,我的脚本获取从 2 开始到较大的预设数字的每个数字的 Collatz 序列的长度,并将该长度保存到一个不断增长的数组中。每 100 次迭代,它会从 all 之前的数据中收集一些统计数据,并将它们保存到这样的字典中:
result = []
data = {}
for count, v in enumerate(range(2, 10000000), 1):
if count % 100 == 0:
result.append(len(collatz_concise(count))-1)
Max = round(max(result), 2)
Min = round(min(result), 2)
Mean = round(sum(result) / len(result))
Median = round(statistics.median(result))
Range = round(Max - Min, 2)
Trim_Mean = round(stats.trim_mean(result, 0.1), 2)
stat = np.array(result)
Q1 = round(np.percentile(stat, 25), 2)
Q3 = round(np.percentile(stat, 75), 2)
data[count] = [Min, Q1, Median, Mean, Trim_Mean, Q3, Max]
我希望每 100 次收集一次统计信息,但仅收集列表的前 100 个值。我环顾四周但找不到合适的答案。
温柔一点,我在这方面和 Whosebug 上都是新手。
周期性动作
执行每 n 个步骤的方法是对 n 取模并检查它是否为零.
跟踪最近的值
跟踪 m 最近值的最简单方法是使用 collections.deque() 并将 maxlen 参数设置为 m.
方法概述
这里有一些代码可以帮助您入门:
>>> n = 15
>>> m = 20
>>> result = deque(maxlen=m)
>>> for i in range(100):
c = collatz(i)
result.append(c)
if i % n == 0:
print(i, '-->', result)
这是输出:
0 --> deque([0], maxlen=20)
15 --> deque([0, 4, 1, 10, 2, 16, 3, 22, 4, 28, 5, 34, 6, 40, 7, 46], maxlen=20)
30 --> deque([34, 6, 40, 7, 46, 8, 52, 9, 58, 10, 64, 11, 70, 12, 76, 13, 82, 14, 88, 15], maxlen=20)
45 --> deque([13, 82, 14, 88, 15, 94, 16, 100, 17, 106, 18, 112, 19, 118, 20, 124, 21, 130, 22, 136], maxlen=20)
60 --> deque([124, 21, 130, 22, 136, 23, 142, 24, 148, 25, 154, 26, 160, 27, 166, 28, 172, 29, 178, 30], maxlen=20)
75 --> deque([28, 172, 29, 178, 30, 184, 31, 190, 32, 196, 33, 202, 34, 208, 35, 214, 36, 220, 37, 226], maxlen=20)
90 --> deque([214, 36, 220, 37, 226, 38, 232, 39, 238, 40, 244, 41, 250, 42, 256, 43, 262, 44, 268, 45], maxlen=20)