标签: defaultdict

python collections.defaultdict,长度为2的列表

我有一种情况,一个键将有两个值,将在程序期间更新.更conretely,从空字典d开始= {},我希望做一些这样的事情: d[a][0] += 1或者d[a][1] += 1其中一个是在程序运行时,还发现了一个float类型.我可以做一些事情d = defaultdict(list([0,0]))(这会产生错误).我希望字典中的默认值是两个元素的列表.我该怎么做呢?

python defaultdict

4
推荐指数
1
解决办法
3645
查看次数

使用自然下标创建三维OrderedDict

我想要一个具有以下属性的字典结构:

  1. 双嵌套(所以,这么多单词都是三维的)
  2. 记住每个级别添加到其中的内容的顺序

所以,如果我像这样添加项目:

# 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)

python ordereddictionary python-2.7 defaultdict

4
推荐指数
1
解决办法
452
查看次数

将参数传递给defaultdict创建的对象

我想要一个默认的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)

python defaultdict

4
推荐指数
1
解决办法
1325
查看次数

在初始化时填充defaultdict

我怎样才能获得一个可调用的工厂用于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)

python list-comprehension generator-expression defaultdict

4
推荐指数
2
解决办法
2574
查看次数

defaultdict vs dict元素初始化

我正在尝试优化脚本的性能,该脚本在给出的每个单词的词典中查找相似的单词.

每个唯一的单词将被分成字母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)

python dictionary defaultdict

4
推荐指数
2
解决办法
4280
查看次数

python:带有非默认参数的defaultdict

我想要类似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)

python dictionary defaultdict karma-runner

4
推荐指数
1
解决办法
1898
查看次数

将CSV数据转换为字典中的列表

我有一个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方法.

python csv dictionary python-3.x defaultdict

4
推荐指数
1
解决办法
849
查看次数

lambda函数返回在defaultdict中使用的键值

函数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)

当然,我正在做一些愚蠢的事情.但是什么?

python lambda defaultdict

4
推荐指数
1
解决办法
1222
查看次数

为什么defaultdict default_factory默认为None?

您不必指定默认工厂(但如果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可选?我不明白用例.

python defaultdict

4
推荐指数
1
解决办法
2072
查看次数

混合defaultdict(dict和int)

我有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)

python python-3.x defaultdict

4
推荐指数
2
解决办法
168
查看次数