【问题标题】:Adding elements to a dictionary of sets将元素添加到集合字典
【发布时间】:2012-02-25 23:31:12
【问题描述】:

我有一本字典 d 的集合。在某个键 key 下添加元素时,我考虑了两种情况 key in dnot key in d

from random import randint

for i in range(1000):
    key = randint(0, 100)

    if key in d:
        d[key] |= set([randint(0, 10)])
    else:
        d[key] = set([randint(0, 10])

有没有更清洁的方法来做到这一点?我可以把这两种情况统一起来吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    我喜欢使用defaultdict,它是一种字典,当您引用尚未定义的键时,它会创建一个默认对象:

    >>> from random import randint
    >>> from collections import defaultdict
    >>> 
    >>> d = defaultdict(set)
    >>> 
    >>> for i in range(10):
    ...     el = randint(0, 5)
    ...     d[el].add(randint(0,10))
    ... 
    >>> d
    defaultdict(<type 'set'>, {0: set([2]), 1: set([7]), 2: set([8, 9, 5, 7]), 
    3: set([1]), 4: set([1, 3, 4])})
    >>> d[0]
    set([2])
    >>> d[2]
    set([8, 9, 5, 7])
    

    【讨论】:

    • 不错!这正是我想要的。
    【解决方案2】:

    试试[defaultdict](http://docs.python.org/library/collections.html#collections.defaultdict)s:from collections import defaultdict

    defaultdict 采用“default factory”参数。基本上,它允许您为尚未“初始化”的键设置默认值。

    因此,在您的示例中,如果 ddefaultdict,您就不必检查 if el in d。虽然该检查仍会返回False,但如果el 尚未在d 中,则执行d[el] |= set([randint(0, 10)]) 基本上会导致以下结果:

    d[el] = set([])
    d[el] |= set([randint(0, 10)])
    

    希望对你有帮助

    【讨论】:

    • 建议的第一部分很好,但他甚至不需要创建另一个集合并以这种方式添加。您可以简单地调用 add() 方法并节省开销。
    • 我的意思只是作为“幕后”发生的事情的一个例子。我不建议他这样做。
    猜你喜欢
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多