如果他们是平等的,则分享frozensets

时间:2013-10-02 18:30:11

标签: python caching

在形成字典的同时,我有很多同等的格式来成为字典值。所以,我想分享同等的冷冻。

以下是可能的解决方案之一:

result = dict()
helper = dict()
for key, value in generate_data():  # generate_data will return a lot of equal frozensets as values
    result[key] = helper.setdefault(value, value)

在此解决方案中,helper字典用于确定当前frozensetfrozentset中保存之前是否已经等helper,如果没有 - 保存它在那里。所有艰苦工作都由setdefault完成。

我不喜欢这个解决方案,一次很难理解(setdefault的重要用法)

所以,我的问题是:
它是否可以用更易读和易懂的方式编写,仍然像这个解决方案一样简洁(或近乎简洁)?

2 个答案:

答案 0 :(得分:1)

实现不会有所不同,但如果你不喜欢实际看到帮助器dict:

class Cache(object):
    __slots__ = ['helper']

    def __init__(self):
        self.helper = dict()

    def __call__(self, hashable):
        return self.helper.setdefault(hashable, hashable)
你会像这样使用它:

result = dict()
cached = Cache()
for key, value in generate_data():  # generate_data will return a lot of equal frozensets as values
    result[key] = cached(value)

这不应该使用比其他解决方案更少的内存,但从语法上来说它可能会更好看。

编辑:只想添加,这也允许类似:

result = dict((key, cached(value)) for key, value in generate_data())

result = {key:cached(value) for key, value in generate_data()}

如果您使用的是Python 2.7+。

答案 1 :(得分:0)

if value not in helper:
    helper[value] = value
result[key] = helper[value]