我有一个功能:
#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):
引发NameError
,globals()['defaultDictOfLists']
引发KeyError
。
有没有办法解决它?它会大量澄清我的代码并加快编码过程。
修改
我没有使用defaultdict(list)
,因为这个字典被传递给Django模板,并且由于某种原因,它们不能很好地处理defaultdicts。因此,如果我没记错的话,我必须将此defaultdict转换回常规字典,这需要花费O(n)时间。
答案 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了解更多信息和用例。