有没有办法defaultdict(defaultdict(int))让以下代码工作?
for x in stuff:
d[x.a][x.b] += x.c_int
Run Code Online (Sandbox Code Playgroud)
d需要根据x.a和x.b元素进行临时构建.
我可以用:
for x in stuff:
d[x.a,x.b] += x.c_int
Run Code Online (Sandbox Code Playgroud)
但后来我无法使用:
d.keys()
d[x.a].keys()
Run Code Online (Sandbox Code Playgroud) 在Perl很多次,我会做这样的事情:
$myhash{foo}{bar}{baz} = 1
Run Code Online (Sandbox Code Playgroud)
我怎么把它翻译成Python?到目前为止,我有:
if not 'foo' in myhash:
myhash['foo'] = {}
if not 'bar' in myhash['foo']:
myhash['foo']['bar'] = {}
myhash['foo']['bar']['baz'] = 1
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
我有一个看起来像这样的defaultdict:
dict1 = defaultdict(lambda: defaultdict(int))
Run Code Online (Sandbox Code Playgroud)
问题是,我不能用cPickle来腌制它.我在这里找到的解决方案之一是使用模块级函数而不是lambda.我的问题是,什么是模块级功能?如何在cPickle中使用字典?
我正在尝试使用部分函数创建一个可选择的装饰器.但是,在尝试这样做时,我一直遇到酸洗错误.
第一个天真的例子如下:
def decorator(func):
def wrapper(**kwargs):
return partial(func, **kwargs)
return wrapper
@decorator
def decorated(x, y=1, z=2):
return x+y+z
y5 = decorated(y=5)
pickle.dumps(y5)
Run Code Online (Sandbox Code Playgroud)
从何partial而来functools.
一点不天真的尝试涉及@wraps在上面添加一行def wrapper.这没有用.
我不确定我是否理解酸洗是如何起作用的.
目前我使用以下方法,假设字典
data[a][b][c]
Run Code Online (Sandbox Code Playgroud)
我用:
if "a" in data and "b" in data["a"] and "c" in data["a"]["b"]:
...
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法?
我正在使用自动激活将数据存储在多处理设置中。但是,我不知道如何将它合并到多处理管理器功能中。
我的自动激活代码来自Python 中的多级 'collection.defaultdict'并且在没有多处理发生时工作正常。
class vividict(dict):
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
Run Code Online (Sandbox Code Playgroud)
我的 multiproc 代码是相对简单的:
if __name__ == "__main__":
man = Manager()
ngramDict = man.dict()
print(ngramDict) # {}
s_queue = Queue()
aProces = Process(target=insert_ngram, args=(s_queue,ngramDict,))
aProces.start()
aProces.join()
print(ngramDict) # {}
write_to_file()
Run Code Online (Sandbox Code Playgroud)
在 insert_ngram 中读取、写入和更新字典:
def insert_ngram(sanitize_queue, ngramDict):
ngramDict = Vividict() # obviously this overwrites the manager
try:
for w in iter(s_queue.get, None):
if ngramDict[w[0]][w[1]][w[2]][w[3]][w[4]]:
ngramDict[w[0]][w[1]][w[2]][w[3]][w[4]]+=int(w[5])
else:
ngramDict[w[0]][w[1]][w[2]][w[3]][w[4]]=int(w[5])
print(ngramDict) …Run Code Online (Sandbox Code Playgroud)