如何将dict_keys转换为整数

时间:2019-01-09 20:17:52

标签: python

我有一本字典,其中的键是整数,并且是按顺序排列的。有时,我需要从字典中删除较旧的条目。但是,当我尝试执行此操作时,遇到“ 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

3 个答案:

答案 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)

您可以使用OrderedDictpop最旧的键值对。使用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.