在Python字典中查找所有键> =整数

时间:2013-03-11 21:12:22

标签: python for-loop dictionary key

说我有以下字典时间密钥字典:

dict = {
  "1363017884": "some val",
  "1363033813": "another val",
}

我想找到大于1363033000的所有密钥(在这种情况下只有1363033813匹配)。我有一个for循环来检查每个键,但这似乎效率很低:

for epoch,value in dict.iteritems():
  if int(epoch) >= 1363033000:
    do something interesting

3 个答案:

答案 0 :(得分:7)

循环词典是你唯一真正的选择,没有更有效的方法。

或者您可以使用不同的数据结构;例如,存储连接到btree结构中的值的整数会使搜索大于或低于给定搜索值的键更有效。

答案 1 :(得分:0)

您可以稍微修改code from here以添加large_keys属性。现在,无论何时添加其中一个大纪元,dict都会跟踪它们。当你想迭代它们时,你可以简单地遍历那个属性。

class MyUpdateDict(dict):
    def __init__(self, *args, **kwargs):
        self.large_keys = []
        self.update(*args, **kwargs)

    def __setitem__(self, key, value):
        # optional processing here
        if int(key)>1363033000:
            self.large_keys.append((key,value))
        super(MyUpdateDict, self).__setitem__(key, value)

    def update(self, *args, **kwargs):
        if args:
            if len(args) > 1:
                raise TypeError("update expected at most 1 arguments, got %d" % len(args))
            other = dict(args[0])
            for key in other:
                self[key] = other[key]
        for key in kwargs:
            self[key] = kwargs[key]

    def setdefault(self, key, value=None):
        if key not in self:
            self[key] = value
        return self[key]

这可能过于简单了,因为大值是硬编码的,但您可以修改以使其更合适。

答案 2 :(得分:0)

如果您在字典中有数字和字符串作为键,请先执行该操作

myStringsList = [s for s in dictFromFile.keys() if s.isdigit()]

这将为您提供一个数字为字符串的列表。

然后将字符串列表转换为int列表仅获取>比X 元素:

myFinalList = [s for s in map(int, mynewlist) if s > X] 

希望它有所帮助!