Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 尝试将项目附加到默认词典_Python_Dictionary_Keyword Argument - Fatal编程技术网

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时,我非常喜欢这个函数。