0

在形成字典时,我有很多相等的冻结集成为字典值。所以,我想分享平等的frozensets。

这是可能的解决方案之一:

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,字典用于查明当前frozenset是否已经与frozentset之前的值相等,并且保存在 中helper,如果不是 - 将其保存在那里。所有的辛勤工作都是由setdefault.

我不喜欢这个解决方案的地方是它很难立即理解(非常重要的用法setdefault

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

4

2 回答 2

1

实现不会有所不同,但如果您不喜欢实际看到辅助字典:

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+。

于 2013-10-02T20:42:28.137 回答
0
if value not in helper:
    helper[value] = value
result[key] = helper[value]
于 2013-10-02T18:33:20.180 回答