Python 尝试将项目附加到默认词典
我有一个功能:Python 尝试将项目附加到默认词典,python,dictionary,keyword-argument,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:
#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]
在大多数情况下,我在一个字典上使用这个函数,我们称它为DefaultDictOfList
,就像我的代码中一样
tryAppendingToDict(defaultDictOfLists, 'spam', 'eggs')
tryAppendingToDict(defaultDictOfLists, 'spam', 'beacon')
tryAppendingToDict(defaultDictOfLists, 'not spam', 'yuck!')
#...
tryAppendingToDict(differentDict, 'spam', 'I don't like spam!')
因此,我想尝试为我的函数创建一个关键字参数,该参数假定您正在将项目附加到defaultdictoflist
。然而,这里的主要问题是,这个函数是从一个单独的模块导入的(应该保留在那里),因此
def tryAppendingToDict(key, item, dictionary = defaultDictOfLists):
引发NameError
,而globals()['DefaultDictOfList']
引发KeyError
有办法解决吗?这将澄清我的代码很多,并加快编码过程以及
编辑 我没有使用
defaultdict(list)
,因为这个字典被传递给Django模板,而这些模板由于某些原因不能很好地处理defaultdict。所以我必须将这个defaultdict转换回一个常规dict,如果我没记错的话,这需要O(n)个时间。为什么不把它改成monkeypatch呢?你可以:
from module import tryAppendingToDict as _tryAppendingToDict
def tryAppendingToDict(key, item, dictionary=defaultDictOfLists):
return _tryAppendingToDict(dictionary, key, item)
并在实际定义了defaultdictoflist
的模块中使用此函数
此外,我看不出这段代码有什么用处,当然可以使用defaultdict
,但也可以使用字典的方法。它会将字典插入减少到一行,使tryaappendingtodict()
无用:
>>>d={}
>>>d.setdefault('key',['value'])
>>>d
{'key': ['value']}
如果要在列表中包含作为字典值的组项目,可以使用
集合。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]})
[10]中的:数据
Out[10]:defaultdict(,{0:[0,3,6,9],1:[1,4,7],2:[2,5,8]})
有关更多信息和用例,请参阅。您一直在使用术语“defaultDict”,但似乎您正在尝试实现一个与。如果您使用的是2.5或更高版本,您可以直接使用该版本。我会为DefaultDictOfLists的值添加一个setter函数。请参阅我编辑的问题,抱歉没有尽早澄清这一点。是的,猴子补丁是一个好主意
setdefault
不太可能,因为我必须尝试附加项目,而不是添加它们。@Dunno您可以使用setdefault
:d.setdefault('key',['value'])。append('value2')
,您将得到{'key':['value','value2']}
。它相当强大setdefault
调用时返回default
值,因此可以对其应用方法。是的,但我不能在for循环中执行,因为d.setdefault(key,[value])。append(value)
将追加value
两次。我必须使用如果
或无论如何都要尝试
。我不想卖给你setdefault
:),但你可以这样做:d.setdefault(key,[])。append(value)
。默认为空列表,并将值
附加到其中。在使用dicts时,我非常喜欢这个函数。