2015-02-08 103 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另一个答案细微变化: ) 谢啦。 – 2015-02-08 20:13:41

+0

@NewPythonUser:很高兴帮助。随时接受我的回答,如果它已经帮助你 – 2015-02-08 20:14:37

1

使用一个collections.defaultdict + collections.deque具有最大长度设置为3:

from collections import deque,defaultdict 

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

然后d[name].append(score),如果密钥不存在的键/值将被创建,如果它存在,我们只会追加。

从列表的开头删除元素是一种效率低下的解决方案。

演示:保持在蟒蛇最后N项

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,谢谢。 – 2015-02-08 21:25:42

0

的一个好方法是使用deque与MAXLEN N,所以在这种情况下,你可以使用defaultdictdeque功能从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] 
相关问题