0

假设我有以下纪元时间键字典:

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

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

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

3 回答 3

7

遍历字典是您唯一真正的选择,没有更有效的方法。

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

于 2013-03-11T21:13:07.927 回答
0

您可以从此处稍微修改代码以添加large_keys属性。现在,每当添加其中一个大纪元时,字典都会跟踪它们。当你想迭代它们时,你可以简单地迭代那个属性。

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]

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

于 2013-03-11T21:36:21.297 回答
0

如果您将数字和字符串作为字典中的键,请先执行此操作

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

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

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

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

希望能帮助到你!

于 2015-12-03T12:26:11.190 回答