尝试将项目附加到默认字典

时间:2014-03-24 17:46:31

标签: python dictionary keyword-argument

我有一个功能:

#Should be named tryAppendingToListInADict but I'm too lazy for that long of a name
def tryAppendingToDict(dictionary, key, item):
    try:
        #append to an existing list
        dictionary[key].append(item)
    except KeyError:
        #list doesn't exist yet, so make one
        dictionary[key] = [item]

在大多数情况下,我在一个字典上使用此函数,我们称之为defaultDictOfLists,就像在我的代码中看起来像

tryAppendingToDict(defaultDictOfLists, 'spam', 'eggs')
tryAppendingToDict(defaultDictOfLists, 'spam', 'beacon')
tryAppendingToDict(defaultDictOfLists, 'not spam', 'yuck!')
#...
tryAppendingToDict(differentDict, 'spam', 'I don't like spam!')

所以我想尝试为我的函数创建一个关键字参数,假设你将项目附加到defaultDictOfLists。但是,这里的主要问题是这个函数是从一个单独的模块导入的(并且应该保留在那里),所以很简单

def tryAppendingToDict(key, item, dictionary = defaultDictOfLists):

引发NameErrorglobals()['defaultDictOfLists']引发KeyError

有没有办法解决它?它会大量澄清我的代码并加快编码过程。


修改

我没有使用defaultdict(list),因为这个字典被传递给Django模板,并且由于某种原因,它们不能很好地处理defaultdicts。因此,如果我没记错的话,我必须将此defaultdict转换回常规字典,这需要花费O(n)时间。

2 个答案:

答案 0 :(得分:0)

为什么你不只是 monkeypatch 呢?你可以:

from module import tryAppendingToDict as _tryAppendingToDict

def tryAppendingToDict(key, item, dictionary=defaultDictOfLists):
    return _tryAppendingToDict(dictionary, key, item)

在实际定义defaultDictOfLists的模块中使用此功能。

此外,我看不到此代码的用处,确定您可以使用defaultdict,但您也可以使用词典“setdefault方法。它会将字典插入减少到一行,使tryAppendingToDict()变得无用:

>>>d={}
>>>d.setdefault('key',['value'])
>>>d
{'key': ['value']}

答案 1 :(得分:0)

如果您希望列表中的组项目是字典值,则可以使用collections.defaultdict

import collections

data = collections.defaultdict(list)
raw = [(i % 3, i) for i in range(10)] # sample data

for key, value in raw:
    data[key].append(value)

没有太多麻烦你得到你想要的东西:

In [10]: data
Out[10]: defaultdict(<type 'list'>, {0: [0, 3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]})

请参阅http://docs.python.org/2/library/collections.html#collections.defaultdict了解更多信息和用例。