标签: defaultdict

collections.defaultdict如何运作?

我已经阅读了python文档中的示例,但仍然无法弄清楚这个方法的含义.有人可以帮忙吗?以下是python文档中的两个示例

>>> from collections import defaultdict

>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
...
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
Run Code Online (Sandbox Code Playgroud)

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
Run Code Online (Sandbox Code Playgroud)

参数intlist用于什么?

python dictionary default-value defaultdict

455
推荐指数
11
解决办法
33万
查看次数

defaultdict的嵌套defaultdict

有没有办法使defaultdict也成为defaultdict的默认值?(即无限级递归defaultdict?)

我希望能够做到:

x = defaultdict(...stuff...)
x[0][1][0]
{}
Run Code Online (Sandbox Code Playgroud)

所以,我可以这样做x = defaultdict(defaultdict),但那只是第二级:

x[0]
{}
x[0][0]
KeyError: 0
Run Code Online (Sandbox Code Playgroud)

有些食谱可以做到这一点.但是它可以简单地使用普通的defaultdict参数吗?

注意这是在询问如何进行无限级别的递归defaultdict,所以它与Python不同:defaultdict的defaultdict?,这是如何做一个两级默认.

我可能最终会使用模式,但当我意识到我不知道如何做到这一点时,它让我感兴趣.

python recursion defaultdict

109
推荐指数
5
解决办法
3万
查看次数

Python:`如果键入dict`与`try/except` - 这是更具可读性的成语?

我有一个关于习语和可读性的问题,似乎有一个针对这个特殊情况的Python哲学冲突:

我想从字典B中构建字典A.如果B中不存在特定的键,则不执行任何操作并继续.

哪种方式更好?

try:
    A["blah"] = B["blah"]
except KeyError:
    pass
Run Code Online (Sandbox Code Playgroud)

要么

if "blah" in B:
    A["blah"] = B["blah"]
Run Code Online (Sandbox Code Playgroud)

"做并请求原谅"与"简单和明确".

哪个更好?为什么?

python idioms readability code-readability defaultdict

86
推荐指数
4
解决办法
6万
查看次数

Python:将defaultdict转换为dict

我怎样才能转换defaultdict

number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
Run Code Online (Sandbox Code Playgroud)

成为一个普通的词典?

{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Run Code Online (Sandbox Code Playgroud)

python defaultdict

72
推荐指数
3
解决办法
4万
查看次数

Python defaultdict和lambda

在别人的代码中,我读了以下两行:

x = defaultdict(lambda: 0)
y = defaultdict(lambda: defaultdict(lambda: 0))
Run Code Online (Sandbox Code Playgroud)

由于defaultdict的参数是默认工厂,我认为第一行意味着当我为不存在的密钥k调用x [k]时(例如像v = x [k]这样的语句),键值对(k) ,0)将自动添加到字典中,就像首次执行语句x [k] = 0一样.我对么?

你呢?似乎默认工厂将创建一个默认为0的defaultdict.但这具体意味着什么呢?我尝试在Python shell中使用它,但无法弄清楚它究竟是什么.

python collections defaultdict

53
推荐指数
4
解决办法
4万
查看次数

python格式字符串未使用的命名参数

比方说我有:

action = '{bond}, {james} {bond}'.format(bond='bond', james='james')
Run Code Online (Sandbox Code Playgroud)

这个输出:

'bond, james bond' 
Run Code Online (Sandbox Code Playgroud)

接下来我们有:

 action = '{bond}, {james} {bond}'.format(bond='bond')
Run Code Online (Sandbox Code Playgroud)

这将输出:

KeyError: 'james'
Run Code Online (Sandbox Code Playgroud)

是否有一些解决方法可以防止此错误发生,例如:

  • 如果keyrror:忽略,别管它(但要解析别人)
  • 比较格式字符串和可用的命名参数,如果缺少则添加

python string string-formatting missing-data defaultdict

48
推荐指数
5
解决办法
2万
查看次数

不能pickle defaultdict

我有一个看起来像这样的defaultdict:

dict1 = defaultdict(lambda: defaultdict(int))
Run Code Online (Sandbox Code Playgroud)

问题是,我不能用cPickle来腌制它.我在这里找到的解决方案之一是使用模块级函数而不是lambda.我的问题是,什么是模块级功能?如何在cPickle中使用字典?

python pickle defaultdict

46
推荐指数
6
解决办法
1万
查看次数

python defaultdict:0 vs. int和[] vs list

传递intlambda: 0作为参数之间有什么区别吗?或者之间listlambda: []

看起来他们做同样的事情:

from collections import defaultdict
dint1 = defaultdict(lambda: 0)
dint2 = defaultdict(int)
dlist1 = defaultdict(lambda: [])
dlist2 = defaultdict(list)

for ch in 'abracadabra':
    dint1[ch] += 1
    dint2[ch] += 1
    dlist1[ch].append(1)
    dlist2[ch].append(1)

print dint1.items()
print dint2.items()
print dlist1.items()
print dlist2.items()
## -- Output: --
[('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]
[('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]
[('a', [1, 1, 1, 1, 1]), …
Run Code Online (Sandbox Code Playgroud)

python collections defaultdict

35
推荐指数
1
解决办法
3万
查看次数

defaultdict,默认值为1?

我是python的新手,我从某个地方读了一些代码片段.这是计数排序的一种实现.

代码如下:

from collections import defaultdict
def sort_colors(A):
    ht = {}                        # a hash map
    ht = defaultdict(lambda:0, ht) # with default value 1
    for i in A:
         ht[i] += 1
    ret = []
    for k in [0, 1, 2]:
        ret.extend([k]*ht[k])
    return ret
Run Code Online (Sandbox Code Playgroud)

就像在func的前两行中一样

ht = {}
ht = defaultdict(lambda:0, ht)
Run Code Online (Sandbox Code Playgroud)

关于这个初始化我不是很清楚.你能不能帮我解决一下?还有,我们只需用以下内容替换这两行吗?

ht = defaultdict(int) # default value 0
Run Code Online (Sandbox Code Playgroud)

python defaultdict

32
推荐指数
3
解决办法
3万
查看次数

将`defaultdict`暴露为常规`dict`

defaultdict(set)用来填充非常大的数据结构中的内部映射.填充后,整个结构(包括映射)将暴露给客户端代码.那时,我不希望任何人修改映射.

并且没有人故意这样做.但有时,客户端代码可能会意外地引用不存在的元素.此时,普通字典会引发KeyError,但由于映射是defaultdict,它只是在该键上创建一个新元素(空集).这很难理解,因为一切都是默默无闻的.但我需要确保不会发生这种情况(语义实际上不会中断,但映射会变得很大).

我该怎么办?我可以看到这些选择:

  1. 查找当前和未来客户端代码中的所有实例,其中对映射执行字典查找,并将其转换为其他实例mapping.get(k, {}).这太可怕了.

  2. defaultdict数据结构完全初始化后,通过将其转换为"冻结" dict.(我知道它并没有真正冻结,但我相信客户端代码实际上并没有写mapping[k] = v.)不雅,并且性能大.

  3. 包装defaultdict成一个dict界面.这样做的优雅方式是什么?我担心性能损失可能很大(这种查找在紧密循环中被大量使用).

  4. 子类defaultdict并添加一个"关闭"所有defaultdict功能的方法,使其表现得像是常规的dict.这是上面3的变种,但我不确定它是否更快.如果不依赖于实施细节,我不知道它是否可行.

  5. dict在数据结构中使用regular ,重写那里的所有代码,首先检查元素是否在字典中,如果不在,则添加它.不好.

python wrapper python-3.x defaultdict

25
推荐指数
1
解决办法
4076
查看次数