这个Python代码可以缩短,并且仍然可以使用itertools和sets读取吗?
result = {}
for widget_type, app in widgets:
if widget_type not in result:
result[widget_type] = []
result[widget_type].append(app)
Run Code Online (Sandbox Code Playgroud)
我只能想到这个:
widget_types = zip(*widgets)[0]
dict([k, [v for w, v in widgets if w == k]) for k in set(widget_types)])
Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的defaultdict:
dict1 = defaultdict(lambda: defaultdict(int))
Run Code Online (Sandbox Code Playgroud)
问题是,我不能用cPickle来腌制它.我在这里找到的解决方案之一是使用模块级函数而不是lambda.我的问题是,什么是模块级功能?如何在cPickle中使用字典?
我正在使用默认字典.我需要pprint.
然而,当我pprint......这就是它的样子.
defaultdict(<functools.partial object at 0x1f68418>, {u'300:250': defaultdict(<functools.partial object at 0x1f683c0>, {0: defaultdict(<type 'list'>, {u'agid1430864021': {u'status': u'0', u'exclude_regi..........
Run Code Online (Sandbox Code Playgroud)
如何pprint使用默认字典?
我defaultdict(set)用来填充非常大的数据结构中的内部映射.填充后,整个结构(包括映射)将暴露给客户端代码.那时,我不希望任何人修改映射.
并且没有人故意这样做.但有时,客户端代码可能会意外地引用不存在的元素.此时,普通字典会引发KeyError,但由于映射是defaultdict,它只是在该键上创建一个新元素(空集).这很难理解,因为一切都是默默无闻的.但我需要确保不会发生这种情况(语义实际上不会中断,但映射会变得很大).
我该怎么办?我可以看到这些选择:
查找当前和未来客户端代码中的所有实例,其中对映射执行字典查找,并将其转换为其他实例mapping.get(k, {}).这太可怕了.
defaultdict数据结构完全初始化后,通过将其转换为"冻结" dict.(我知道它并没有真正冻结,但我相信客户端代码实际上并没有写mapping[k] = v.)不雅,并且性能大.
包装defaultdict成一个dict界面.这样做的优雅方式是什么?我担心性能损失可能很大(这种查找在紧密循环中被大量使用).
子类defaultdict并添加一个"关闭"所有defaultdict功能的方法,使其表现得像是常规的dict.这是上面3的变种,但我不确定它是否更快.如果不依赖于实施细节,我不知道它是否可行.
dict在数据结构中使用regular ,重写那里的所有代码,首先检查元素是否在字典中,如果不在,则添加它.不好.
使用这样的回答,我创建了一个defaultdict的defaultdict秒.现在,我想把那个深层嵌套的dict对象变回普通的python dict.
from collections import defaultdict
factory = lambda: defaultdict(factory)
defdict = factory()
defdict['one']['two']['three']['four'] = 5
# defaultdict(<function <lambda> at 0x10886f0c8>, {
# 'one': defaultdict(<function <lambda> at 0x10886f0c8>, {
# 'two': defaultdict(<function <lambda> at 0x10886f0c8>, {
# 'three': defaultdict(<function <lambda> at 0x10886f0c8>, {
# 'four': 5})})})})
Run Code Online (Sandbox Code Playgroud)
我认为这不是正确的解决方案:
import json
regdict = json.loads(json.dumps(defdict))
# {u'one': {u'two': {u'three': {u'four': 5}}}}
Run Code Online (Sandbox Code Playgroud)
此外,这个答案是不充分的,因为它没有递归嵌套的字典.
有几次(甚至连续几次)我被defaultdict错误所困扰:忘记了某些东西实际上是一个默认的,并把它当成一个普通的字典.
d = defaultdict(list)
...
try:
v = d["key"]
except KeyError:
print "Sorry, no dice!"
Run Code Online (Sandbox Code Playgroud)
对于那些被咬过的人来说,问题很明显:当d没有键'key'时,v = d["key"]神奇地创建一个空列表并将其分配给两者d["key"]而v不是引发异常.如果d来自某些模块,其中的细节不太清楚,那么追踪可能会非常痛苦.
我正在寻找一种方法来消除这个bug.对我来说,最好的解决方案是以某种方式禁用defaultdict的魔法,然后再将其返回给客户端.
我有一个 4 列的 DataFrame
Subject_id Subject Time Score
Subject_1 Math Day 1
Subject_1 Math Night 2
Subject_1 Music Day 3
Subject_1 Music Night 4
Subject_2 Math Day 5
Subject_2 Math Night 6
Subject_2 Music Day 7
Subject_2 Music Night 8
Run Code Online (Sandbox Code Playgroud)
我想对这些列进行分层分组并将它们转换为字典,如下所示:
result = {
'Subject_1': {
'Math': {
'Day': 1,
'Night': 2
},
'Music': {
'Day': 3,
'Night': 4
}
}
'Subject_2': {
'Math': {
'Day': 5,
'Night': 6
},
'Music': {
'Day': 7,
'Night': 8
}
}
}
Run Code Online (Sandbox Code Playgroud)
我设法 …
我有一个defaultdict(list),我用来simplejson.dumps(my_defaultdict)将其输出defaultdict为 JSON 格式。我正在使用来自http://bl.ocks.org/mbostock/4063570 的树状图的 HTML 代码,但我试图将我的defaultdict信息转换为作者正在使用的 JSON 文件的格式。此 JSON 文件名为:/mbostock/raw/4063550/flare.JSON并且可以在此链接中找到:http://bl.ocks.org/mbostock/raw/4063550/flare.json。
所以这是我的 defaultdict 数据:
my_defaultdict = {5: ['child10'], 45: ['child92', 'child45'], 33:['child38']}
json_data = simplejson.dumps(my_defaultdict)
Run Code Online (Sandbox Code Playgroud)
所以我当前的 json_data 看起来像这样:
{
"5": [
"child10"
],
"45": [
"child92",
"child45"
],
"33": [
"child38"
]
}
Run Code Online (Sandbox Code Playgroud)
因此,在我的理解中,数字将是相应的“名称”:“5”,然后我的 JSON 格式文件也会将孩子作为“孩子”。就像现在一样,我的 JSON 格式输出不在树状图的 HTML 代码中运行。
预期的结果是这样的:
{
"name": "flare",
"children": [
{
"name": "5",
"children": [
{
"name": "child10", "size": 5000},
] …Run Code Online (Sandbox Code Playgroud) python ×8
dictionary ×3
defaultdict ×2
collections ×1
dataframe ×1
html ×1
json ×1
pandas ×1
pickle ×1
python-2.7 ×1
python-3.x ×1
wrapper ×1