我有一本字典,其中的键是整数,并且是按顺序排列的。有时,我需要从字典中删除较旧的条目。但是,当我尝试执行此操作时,遇到“ dict_keys”错误。
'<=' not supported between instances of 'dict_keys' and 'int'
当我尝试将值转换为int时,被告知不支持该操作。
int() argument must be a string, a bytes-like object or a number, not 'dict_keys'
我在这里看到回答说要使用列表理解。但是,由于该词典中可能有上百万个条目,所以我希望可以通过某种方式执行转换,而不必在整个键列表上执行转换。
import numpy as np
d = dict()
for i in range(100):
d[i] = i+10
minId = int(np.min(d.keys()))
while(minId <= 5):
d.pop(minId)
minId += 1
答案 0 :(得分:3)
您无需将dict_keys
转换为int
。无论如何,那不是一件有意义的事情。您的问题是np.min
需要一个序列,而d.keys()
的返回值不是一个序列。
要获得最少的可迭代次数,请使用常规Python min
,而不是np.min
。但是,循环调用min
是做事的低效方法。 heapq.nsmallest
可能会有所帮助,或者您会找到比字典更好的数据结构。
答案 1 :(得分:0)
您想要一个列表,是否要使用numpy:
minId = np.min(list(d))
但是实际上您可以在此处使用内置的min
,它介绍了如何进行迭代,对于字典来说,迭代还是会在键上进行
minId = min(d)
答案 2 :(得分:0)
您可以使用OrderedDict和pop
最旧的键值对。使用OrderedDict
的好处是它可以记住第一次插入键的顺序。在此代码中,第一个键将始终是OrderedDict
d中的最小值。使用popitem(last=False)
时,它只会删除最早的或第一个键值对。
from collections import OrderedDict
d = OrderedDict()
for i in range(100):
d[i] = i+10
d.popitem(last=False) #removes the earliest key-value pair from the dict
print(d)
如果要删除最旧的5个键值对,请将这些键值对提取到元组列表中,然后再次使用popitem(last=False)
从顶部将其删除(类比):< / p>
a = list(d.items())[:5] #get the first 5 key-value pairs in a list of tuples
for i in a:
if i in d.items():
print("Item {} popped from dictionary.".format(i))
d.popitem(last=False)
#Output:
Item (0, 10) popped from dictionary.
Item (1, 11) popped from dictionary.
Item (2, 12) popped from dictionary.
Item (3, 13) popped from dictionary.
Item (4, 14) popped from dictionary.