如何只为字典中的键存储 3 个值? Python
How to only store 3 values for a key in a dictionary? Python
所以我试图只允许程序为每个键(名称)存储最后 3 个分数(值)但是我遇到了一个问题,程序只存储 3 个分数然后不更新最后 3 个或程序附加更多的值,然后它应该做。
我目前的代码:
#appends values if a key already exists
while tries < 3:
d.setdefault(name, []).append(scores)
tries = tries + 1
虽然我不能完全理解你的问题,但我从中得出的概念是,你只想存储列表中的最后三个分数。这是一个简单的任务。
d.setdefault(name,[]).append(scores)
if len(d[name])>3:
del d[name][0]
此代码将在每次添加时检查列表的长度是否超过 3。如果超过,则删除第一个元素(添加在最后三个元素之前)
使用最大长度设置为 3 的 collections.defaultdict + collections.deque:
from collections import deque,defaultdict
d = defaultdict(lambda: deque(maxlen=3))
然后 d[name].append(score)
,如果键不存在,将创建 key/value,如果存在,我们将追加。
从列表开头删除元素是一种低效的解决方案。
演示:
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)})
将最后 N 项保留在 python 中的一个好方法是使用 deque
和 maxlen N,因此在这种情况下,您可以使用 collections
中的 defaultdict
and deque
函数模块。
示例:
>>> 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)})
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
如果您想扩展条目中的列表,则对另一个答案略有不同 name
d.setdefault(name,[]).extend(scores)
if len(d[name])>3:
del d[name][:-3]
所以我试图只允许程序为每个键(名称)存储最后 3 个分数(值)但是我遇到了一个问题,程序只存储 3 个分数然后不更新最后 3 个或程序附加更多的值,然后它应该做。
我目前的代码:
#appends values if a key already exists
while tries < 3:
d.setdefault(name, []).append(scores)
tries = tries + 1
虽然我不能完全理解你的问题,但我从中得出的概念是,你只想存储列表中的最后三个分数。这是一个简单的任务。
d.setdefault(name,[]).append(scores)
if len(d[name])>3:
del d[name][0]
此代码将在每次添加时检查列表的长度是否超过 3。如果超过,则删除第一个元素(添加在最后三个元素之前)
使用最大长度设置为 3 的 collections.defaultdict + collections.deque:
from collections import deque,defaultdict
d = defaultdict(lambda: deque(maxlen=3))
然后 d[name].append(score)
,如果键不存在,将创建 key/value,如果存在,我们将追加。
从列表开头删除元素是一种低效的解决方案。
演示:
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)})
将最后 N 项保留在 python 中的一个好方法是使用 deque
和 maxlen N,因此在这种情况下,您可以使用 collections
中的 defaultdict
and deque
函数模块。
示例:
>>> 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)})
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
如果您想扩展条目中的列表,则对另一个答案略有不同 name
d.setdefault(name,[]).extend(scores)
if len(d[name])>3:
del d[name][:-3]