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循环.你称之为额外的一步; 我称之为明确而明显的方式.
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)