追加到列表的defaultdict的一步初始化?

iru*_*var 14 python defaultdict

如果a defaultdict可以沿着以下行初始化将是方便的

d = defaultdict(list, (('a', 1), ('b', 2), ('c', 3), ('d', 4), ('a', 2),
   ('b', 3)))
Run Code Online (Sandbox Code Playgroud)

生产

defaultdict(<type 'list'>, {'a': [1, 2], 'c': [3], 'b': [2, 3], 'd': [4]})
Run Code Online (Sandbox Code Playgroud)

相反,我得到了

defaultdict(<type 'list'>, {'a': 2, 'c': 3, 'b': 3, 'd': 4})
Run Code Online (Sandbox Code Playgroud)

为了得到我需要的东西,我最终必须这样做:

d = defaultdict(list)
for x, y in (('a', 1), ('b', 2), ('c', 3), ('d', 4), ('a', 2), ('b', 3)):
    d[x].append(y)
Run Code Online (Sandbox Code Playgroud)

这是国际海事组织的一步,应该是必要的,我在这里错过了什么?

Joh*_*n Y 17

你显然缺少的defaultdict是一个简单的(不是特别"神奇的")子类dict.所有第一个参数都是为缺失键提供工厂函数.初始化a时defaultdict,您正在初始化a dict.

如果你想生产

defaultdict(<type 'list'>, {'a': [1, 2], 'c': [3], 'b': [2, 3], 'd': [4]})
Run Code Online (Sandbox Code Playgroud)

你应该按照初始化dict其值为列表的任何其他方式初始化它:

d = defaultdict(list, (('a', [1, 2]), ('b', [2, 3]), ('c', [3]), ('d', [4])))
Run Code Online (Sandbox Code Playgroud)

如果你的初始数据必须是元组的形式,其第二个元素总是一个整数,那么就去for循环.你称之为额外的一步; 我称之为明确而明显的方式.

  • +1。顺便说一句,也将其初始化为`defaultdict(list,{'a':[1,2],'c':[3],'b':[2,3],'d':[4]}))作品。 (3认同)

Sin*_*ion 10

您描述的行为与defaultdict其他行为不一致.好像你想要的就是FooDict这样

>>> f = FooDict()
>>> f['a'] = 1
>>> f['a'] = 2
>>> f['a']
[1, 2]
Run Code Online (Sandbox Code Playgroud)

我们可以这样做,但不能用defaultdict; 我们称之为AppendDict

import collections

class AppendDict(collections.MutableMapping):
    def __init__(self, container=list, append=None, pairs=()):
        self.container = collections.defaultdict(container)
        self.append = append or list.append
        for key, value in pairs:
            self[key] = value

    def __setitem__(self, key, value):
        self.append(self.container[key], value)

    def __getitem__(self, key): return self.container[key]
    def __delitem__(self, key): del self.container[key]
    def __iter__(self): return iter(self.container)
    def __len__(self): return len(self.container)
Run Code Online (Sandbox Code Playgroud)