2016-07-28 1 views
-3

У меня есть словарь, где каждый ключ имеет несколько значений. Можно ли включить только последние 7 значений для каждого ключа, а затем выполнить с ним базовую арифметику (например: сложение, вычитание, умножение, деление)?Python: Включая только последние 7 значений в каждой клавише

Конечная цель состоит в том, чтобы иметь возможность загружать данные с датой и иметь возможность включать только прошедшую неделю, месяц или год.

Любые толчки в правильном направлении очень ценятся.

+2

Да, конечно, это возможно. Почему бы не попробовать на самом деле? * – jonrsharpe

+1

«каждая клавиша имеет несколько значений». Вы имеете в виду, что это список? Кортеж? Вы говорите только о несущественной части структуры данных. Не имеет значения, что у вас есть дикт здесь, потому что вы только спрашиваете о значении для одного конкретного ключа, о котором вы ничего нам не говорите. –

ответ

0

Как вы храните несколько значений каждой клавиши? Если вы используете список, то все, что вам нужно сделать, это ссылки на последние элементы X этого списка.

Предполагая, что вам нужно сохранить весь словарь и ссылаться только последние X элементы:

my_dict = {key1:[e_a1, e_a2, ... e_a9], key2:[e_b1, e_b2, ... e_b9]} 

За последние 7 элементов «ключом1» все, что вам нужно сделать, это, ссылаться на него, как my_dict[key1][-7:]. Используя эту ссылку, вы получите список [e_a3, ..., e_a9].

Этот ответ также предполагает, что ваш список уже упорядочен по дате во время создания.

+0

Зачем голосовать? Это вся информация, предоставленная ОП. –

+0

Я не спускал вниз, но хранение всех данных, когда вам нужны только последние семь значений, может означать продувание основной памяти, если значения на ключ существенно больше 7. – ShadowRanger

+0

Да, это, конечно, так. Очевидным способом решения этой проблемы является создание структуры данных очереди. Однако OP явно не упомянул, что хочет усечь старые данные. Это зависит от реализации. Ему может потребоваться динамический выбор последних X дней, месяцев или лет. –

2

В зависимости от того, как упорядочены входящие данные (уже отсортировано по сравнению с случайным порядком), я бы посмотрел на collections.deque (который может устанавливать максимальную длину, так что вновь добавленные элементы легко вытесняют старые элементы, когда они достигают указанного предел) для уже отсортированного случая или сворачивание собственного решения с помощью примитивов heapq module (изначально с использованием heapq.heappush, затем переход на heappushpop при достижении емкости) для неупорядоченного входного регистра.

Использование collections.defaultdict с любым подходом в качестве базового типа хранилища упростит код.

Пример с ограниченной deque:

from collections import defaultdict, deque 

recentdata = defaultdict(lambda: deque(maxlen=7)) 
for k, v in mydata: 
    recentdata[k].append(v) # If deque already size 7, first entry added is bumped out 

или heapq:

from collections import defaultdict 
from heapq import heappush, heappushpop 

recentdata = defaultdict(list) 
for k, v in mydata: 
    kdata = recentdata[k] 
    if len(kdata) < 7: 
     heappush(kdata, v)  # Grow to max size maintaining heap invariant 
    else: 
     heappushpop(kdata, v) # Remain at max size, discarding smallest value (old or new) 

 Смежные вопросы

  • Нет связанных вопросов^_^