我有一种情况,一个键将有两个值,将在程序期间更新.更conretely,从空字典d开始= {},我希望做一些这样的事情:
d[a][0] += 1或者d[a][1] += 1其中一个是在程序运行时,还发现了一个float类型.我可以做一些事情d = defaultdict(list([0,0]))(这会产生错误).我希望字典中的默认值是两个元素的列表.我该怎么做呢?
我想要一个具有以下属性的字典结构:
所以,如果我像这样添加项目:
# d = something dict-ish
d['a']['b']['c'] = 'd'
d['a'][1][2] = 3
d['f']['g']['e'] = 'g'
d['f'][5][6] = 7
d['a']['foo']['bar'] = 'hello world'
Run Code Online (Sandbox Code Playgroud)
以下理解的结果:
[(i, j, k, d[i][j][k]) for i in d for j in d[i] for k in d[i][j]]
Run Code Online (Sandbox Code Playgroud)
将会:
[('a', 'b', 'c', 'd'), ('a', 1, 2, 3), ('a', 'foo', 'bar', 'hello world'), ('f', 'g', 'e', 'g'), ('f', 5, 6, 7)]
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用a defaultdict为新键强制执行此结构,因此我不必长途键入它,如下所示:
# long way
d = OrderedDict()
d['a'] = OrderedDict([('b', OrderedDict([('c', 'd')]))])
d['a'][1] = …Run Code Online (Sandbox Code Playgroud) 我想要一个默认的dict,它在构造一个新对象时包含一个参数.这有可能吗,有没有更好的方法呢?
defaultdict(myobj, param1)
Run Code Online (Sandbox Code Playgroud)
那么myobj:
class myobj(object):
def __init__(self, param1):
self.param1 = param1
Run Code Online (Sandbox Code Playgroud) 我怎样才能获得一个可调用的工厂用于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
Run Code Online (Sandbox Code Playgroud) 我正在尝试优化脚本的性能,该脚本在给出的每个单词的词典中查找相似的单词.
每个唯一的单词将被分成字母n-gram,并且对于每个n-gram,词典返回包含相同字母n-gram的单词列表.然后将此列表中的每个单词作为键添加到字典中,并将其值加1.这给了我一个具有相应频率分数的类似单词的字典.
word_dict = {}
get = word_dict.get
for letter_n_gram in word:
for entry in lexicon[n_gram]:
word_dict[entry] = get(entry, 0) + 1
Run Code Online (Sandbox Code Playgroud)
这个实现有效,但是通过切换dictfor 可以更快地运行脚本collections.defaultdict.
word_dd = defaultdict(int)
for letter_n_gram in word:
for entry in lexicon[n_gram]:
word_dd[entry] += 1
Run Code Online (Sandbox Code Playgroud)
没有其他代码被更改.
我的印象是两个代码片段(最重要的是分数添加)应该以完全相同的方式工作,即如果密钥存在,将其值增加1,如果它不存在,则创建密钥并将值设置为1.
但是,在运行新代码之后,某些键的值为0,我觉得这在逻辑上是不可能的.
我的逻辑或defaultdict功能知识是否有缺陷?如果没有,如何将任何值word_dd设置为0?
编辑:我也非常确定脚本中没有其他部分会扭曲这些结果,因为我使用以下代码在显示代码后立即测试字典:
for item in word_dd.iteritems():
if item[1] == 0:
print "Found zero value element"
break
Run Code Online (Sandbox Code Playgroud) 我想要类似a dict的东西,class TestClass其中包含非默认参数。当我访问时,我不知道要问的元素是否早于此。因此TestClass:
class TestClass(object):
def __init__(self, name):
self.name = name
self.state = 0
def getName(self):
self.state = self.state + 1
return "%s -- %i" % (self.name, self.state)
Run Code Online (Sandbox Code Playgroud)
然后dict和访问函数:
db = {}
def getOutput(key):
# this is a marvel in the world of programming langauges
if key not in db:
db[key] = TestClass(key)
return db[key]
Run Code Online (Sandbox Code Playgroud)
以及实际的测试代码:
if __name__ == "__main__":
print "testing: %s" % getOutput('charlie').getName()
Run Code Online (Sandbox Code Playgroud)
真好 但是我想知道是否有更优雅的解决方案。浏览时,defaultdict进入了我的脑海。但这是行不通的,因为我无法将参数传递给default_factory:
from collections …Run Code Online (Sandbox Code Playgroud) 我有一个CSV文件,格式如下:
Name_1,2,K,14
Name_1,3,T,14
Name_1,4,T,18
Name_2,2,G,12
Name_2,4,T,14
Name_2,6,K,15
Name_3,2,K,12
Name_3,3,T,15
Name_3,4,G,18
Run Code Online (Sandbox Code Playgroud)
我想将它转换为字典,其中Name_x是键,相应的数据是列表形式的值.像这样的东西:
{'Name_1': [[2, 'K', 14], [3, 'T', 14], [4, 'T', 18]],
'Name_2': [[4, 'T', 14], [4, 'T', 14], [6, 'K' ,15]],
...}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我认为我必须使用defaultdict:
from collections import defaultdict
d = defaultdict(list)
Run Code Online (Sandbox Code Playgroud)
但是我append该如何处理数据d呢?我知道defaultdict没有append方法.
函数collections.defaultdict返回一个默认值,如果我的字典中没有键,则可以由我自己制作的lambda函数定义.
现在,我希望我的defaultdict返回未修改的键值,如果该键不存在.因此,我使用lambda标识函数lambda x:x.我希望defaultdict返回密钥.
>>>translation=defaultdict(lambda x:x)
>>>translation['Haus']='maison'
>>>translation['computer']='ordinateur'
>>>translation['computer']
'ordinateur'
Run Code Online (Sandbox Code Playgroud)
但是,当我用迄今为止缺席的密钥呈现我的defaultdict时:
>>>translation['email']
Run Code Online (Sandbox Code Playgroud)
我希望defaultdict转换返回'email'.然而,python 2.7说:
TypeError: <lambda>() takes exactly 1 argument (0 given)
Run Code Online (Sandbox Code Playgroud)
当然,我正在做一些愚蠢的事情.但是什么?
您不必指定默认工厂(但如果None明确传递则相同)
>>> from collections import defaultdict
>>> defaultdict()
defaultdict(None, {})
>>> defaultdict(None)
defaultdict(None, {})
Run Code Online (Sandbox Code Playgroud)
为什么None呢?然后我们得到这个东西:
>>> dd = defaultdict()
>>> dd[0]
# TypeError: 'NoneType' object is not callable <-- expected behaviour
# KeyError: 0 <-- actual behaviour
Run Code Online (Sandbox Code Playgroud)
它甚至被明确允许,因为如果你尝试从其他对象创建一个默认的dict,defaultdict(0)比如说,有一个失败的检查
TypeError: first argument must be callable or None
Run Code Online (Sandbox Code Playgroud)
我认为类似的东西lambda: None会是一个更好的默认工厂.为什么default_factory可选?我不明白用例.
我有2个示例列表,我想要实现的是获取具有值总和的嵌套默认字典.
以下代码很好用:
from collections import defaultdict
l1 = [1,2,3,4]
l2 = [5,6,7,8]
dd = defaultdict(int)
for i in l1:
for ii in l2:
dd[i] += ii
Run Code Online (Sandbox Code Playgroud)
但我要做的是在d字典中创建一个默认密钥:
from collections import defaultdict
l1 = [1,2,3,4]
l2 = [5,6,7,8]
dd = defaultdict(int)
for i in l1:
for ii in l2:
dd[i]['mykey'] += ii
Run Code Online (Sandbox Code Playgroud)
这会抛出一个错误:
Traceback (most recent call last):
File "/usr/lib/python3.6/code.py", line 91, in runcode
exec(code, self.locals)
File "<input>", line 1, in <module>
File "<string>", line 12, in …Run Code Online (Sandbox Code Playgroud) defaultdict ×10
python ×10
dictionary ×3
python-3.x ×2
csv ×1
karma-runner ×1
lambda ×1
python-2.7 ×1