Python: как делать что-то каждые «n» итераций, но только с предыдущими значениями «m»?

Я пытаюсь собрать статистику по гипотезе Коллатца. В настоящее время мой сценарий получает длину последовательности Коллатца для каждого числа, начиная с 2 и заканчивая большим предустановленным числом, и сохраняет эту длину в постоянно растущем массиве. Каждые 100 итераций он собирает несколько статистических данных из всех предыдущих данных и сохраняет их в такой словарь:

    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 значениям списка. Я некоторое время оглядывался, но не мог найти подходящего ответа.

Будьте нежны, я довольно новичок в этом, а также в StackOverflow.


person Peter Sanders    schedule 07.02.2018    source источник
comment
Пожалуйста, сделайте правильный отступ в примере кода. В настоящее время отступ выглядит не сразу после строки if count % 100 ==0:. Крайне важно знать, что входит в состояние, а что нет.   -  person r.ook    schedule 07.02.2018
comment
Ой, извините за это. Починил это   -  person Peter Sanders    schedule 07.02.2018


Ответы (1)


Периодические действия

Чтобы выполнить действие через каждые 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)
person Raymond Hettinger    schedule 07.02.2018
comment
Большое спасибо!! Я даже не слышал о библиотеке коллекций до сих пор - person Peter Sanders; 07.02.2018