2015-02-08 3 views
2

Итак, я попытался разрешить программе сохранять только последние 3 оценки (значения) для каждого ключа (имени), однако у меня возникла проблема с программой, в которой хранятся только 3 балла, а затем не обновляется последнее 3 или приложение, добавляющее больше значений, чем это следует делать.Как хранить только 3 значения для ключа в словаре? Python

код у меня до сих пор:

#appends values if a key already exists 
    while tries < 3: 
     d.setdefault(name, []).append(scores) 
     tries = tries + 1 

ответ

1

Хотя я не мог полностью понять ваш вопрос, понятие, что я выводим из него является то, что вы хотите хранить только последние три оценки в списке. Это простая задача.

d.setdefault(name,[]).append(scores) 
if len(d[name])>3: 
    del d[name][0] 

Этот код проверяет, превышает ли длина списка 3 для каждого добавления. Если он превышает, то первый элемент (который добавляется до трех последних элементов) удаляется

+0

, что это именно то, что я пытался potray:) Спасибо чувак. –

+0

@NewPythonUser: Счастлив, что это помогло. Не стесняйтесь принять мой ответ, если он вам помог –

1

Использовать collections.defaultdict + collections.deque с максимальной длиной равной 3:

from collections import deque,defaultdict 

d = defaultdict(lambda: deque(maxlen=3)) 

Тогда d[name].append(score), если ключ не существует, ключ/значение будет создан, если он существует, мы просто добавим.

Удаление элемента с начала списка является неэффективным решением.

Демо:

from random import randint 

for _ in range(10): 
    for name in range(4): 
      d[name].append(randint(1,10)) 

print(d) 
defaultdict(<function <lambda> at 0x7f06432906a8>, {0: deque([9, 1, 1], maxlen=3), 1: deque([5, 5, 8], maxlen=3), 2: deque([5, 1, 3], maxlen=3), 3: deque([10, 6, 10], maxlen=3)}) 
+0

@georg, спасибо. –

0

Один хороший способ для хранения последних N элементов в Python использует deque с MAXLEN N, так что в этом случае вы можете использовать defaultdict и deque функции от collections модуля.

пример:

>>> from collections import defaultdict ,deque 
>>> l=[1,2,3,4,5] 
>>> d=defaultdict() 
>>> d['q']=deque(maxlen=3) 
>>> for i in l: 
... d['q'].append(i) 
... 
>>> d 
defaultdict(<type 'collections.deque'>, {'q': deque([3, 4, 5], maxlen=3)}) 
0
from collections import defaultdict 
d = defaultdict(lambda:[]) 
d[key].append(val) 
d[key] = d[key][:3] 


len(d[key])>2 or d[key].append(value) # one string solution 
0

Небольшое изменение на другой ответ в случае, если вы хотите, чтобы расширить список в записи name

d.setdefault(name,[]).extend(scores) 
if len(d[name])>3: 
    del d[name][:-3] 
Смежные вопросы