Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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/5/fortran/2.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 在初始时间填充defaultdict_Python_List Comprehension_Defaultdict_Generator Expression - Fatal编程技术网

Python 在初始时间填充defaultdict

Python 在初始时间填充defaultdict,python,list-comprehension,defaultdict,generator-expression,Python,List Comprehension,Defaultdict,Generator Expression,如何为defaultdict获取一个可调用工厂,以允许使用理解填充它?我认为这可能是不可能的,但我想不出一个好的理由为什么 >>> def foo(*args): ... # TODO ... >>> from collections import defaultdict >>> thing = foo(defaultdict, int) >>> d = thing((i, i*i) for i in range(3

如何为defaultdict获取一个可调用工厂,以允许使用理解填充它?我认为这可能是不可能的,但我想不出一个好的理由为什么

>>> def foo(*args):
...     # TODO
...
>>> from collections import defaultdict
>>> thing = foo(defaultdict, int)
>>> d = thing((i, i*i) for i in range(3))
>>> d[2]
# should return 4
>>> d[-1]
# should return 0

您正在查找
defaultdict.update

>>> from collections import defaultdict
>>> thing = defaultdict(int)
>>> thing.update((i, i*i) for i in range(3))
>>> thing
defaultdict(<type 'int'>, {0: 0, 1: 1, 2: 4})
>>从集合导入defaultdict
>>>thing=defaultdict(int)
>>>更新((i,i*i)范围(3)内的i)
>>>东西
defaultdict(,{0:0,1:1,2:4})
你可以把它放到一个函数中

>>> def initdefaultdict(type_, *args, **kwargs):
...     d = defaultdict(type_)
...     d.update(*args, **kwargs)
...     return d
... 
>>> thing = initdefaultdict(int, ((i, i+10) for i in range(3)))
>>> thing
defaultdict(<type 'int'>, {0: 10, 1: 11, 2: 12})
>>> thing[3]
0
>>def initdefaultdict(类型为\、*args、**kwargs):
...     d=默认DICT(类型为)
...     d、 更新(*args,**kwargs)
...     返回d
... 
>>>thing=initdefaultdict(int,((i,i+10)表示范围(3)内的i)
>>>东西
defaultdict(,{0:10,1:11,2:12})
>>>事物[3]
0
或者,要满足原始需求,请返回一个函数:

>>> def defaultdictinitfactory(type_): # this is your "foo"
...     def createupdate(*args, **kwargs):
...             d = defaultdict(type_)
...             d.update(*args, **kwargs)
...             return d
...     return createupdate
... 
>>> f = defaultdictinitfactory(int) # f is your "thing"
>>> d = f((i, i*i) for i in range(3))
>>> d
defaultdict(<type 'int'>, {0: 0, 1: 1, 2: 4})
>>> 
def DEFAULTDICTIONITFactory(类型):#这是您的“foo” ... def createupdate(*args,**kwargs): ... d=默认DICT(类型为) ... d、 更新(*args,**kwargs) ... 返回d ... 返回createupdate ... >>>f=defaultdictinitfactory(int)#f是你的“东西” >>>d=f((i,i*i)表示范围(3)内的i) >>>d defaultdict(,{0:0,1:1,2:4}) >>>
default\u工厂
之后,
defaultdict
的任何参数都与
dict
的参数一样处理:

>>> defaultdict(int, [(i, i*i) for i in range(5)])
defaultdict(<type 'int'>, {0: 0, 1: 1, 2: 4, 3: 9, 4: 16})
或者使用
functools.partial

def defaultdict_factory_factory(default_factory):
    return partial(defaultdict, default_factory)

我不明白你想做什么。什么是
thing
foo
以及为什么
thing
应该返回0?为了澄清:
thing((i,i*i)对于范围(3)中的i)应该返回
defaultdict
实例。我将编辑这个问题以使其更清晰。好的,
-1
让我认为它是一个列表,而不是一个缺少的索引。如果你想要一个
default\u工厂可以做到这一点,我认为这是不可能的,因为(在文档中)“默认工厂在没有参数的情况下被调用,只在getitem中生成一个新值。”我没有想到这一点。如果
update
没有返回None,它几乎可以工作!很不错的!这在文档()中有所说明,但在
帮助(defaultdict)
(至少在我的Python 2.7安装中)中没有提到。是的,defaultdict的docstring中意外地缺少了这一点。我想知道还有多少其他的python小秘密隐藏在那里……如果3.4b2中的docstring中仍然缺少这些,那么应该有人提交一份bug报告。(我假设
defaultdict
受到参数clinic derby的影响,所以你不能只检查最新的3.3版本。)它在最新的主干中仍然缺失,所以我作为旁注提交,OP使用的是genexpr,你已经将其转换为listcomp,没有明显的理由这样做。
def defaultdict_factory_factory(default_factory):
    return partial(defaultdict, default_factory)