我用一个简单的打印命令转储了多个defaultdict,如下所示:
defaultdict(<type 'list'>, {'actual': [20000.0, 19484.0, 19420.0], 'gold': [20000.0, 19484.0, 19464.0]})
Run Code Online (Sandbox Code Playgroud)
我可以使用一些标准的解析器来检索它们吗?我知道我应该使用pickle,但生成这些defaultdict的代码非常慢,我想避免重新运行它.
我有一个字典(数据)列表,并希望将其转换为字典(x),如下所示。我正在使用以下“for循环”来实现。
data = [{'Dept': '0123', 'Name': 'Tom'},
{'Dept': '0123', 'Name': 'Cheryl'},
{'Dept': '0123', 'Name': 'Raj'},
{'Dept': '0999', 'Name': 'Tina'}]
x = {}
for i in data:
if i['Dept'] in x:
x[i['Dept']].append(i['Name'])
else:
x[i['Dept']] = [i['Name']]
Output:
x -> {'0999': ['Tina'], '0123': ['Tom', 'Cheryl', 'Raj']}
Run Code Online (Sandbox Code Playgroud)
是否可以在字典理解或任何其他更pythonic的方式中实现上述逻辑?
python dictionary append defaultdict dictionary-comprehension
我在嵌套的defaultdict中更新列表时遇到问题.
这是我的代码:
a = ['20160115', 'shadyside medical building', 1, 'Review']
b = ['20160115', 'shadyside medical building', 1, 'Video']
c = ['20160215', 'shadyside medical building', 1, 'Video']
d = ['20160215', 'medical building', 1, 'Video']
f = [a,b,c,d]
nested_dict = defaultdict(dict)
for date,keyword,pos,feature in f:
nested_dict[keyword].update({feature : [pos]})
nested_dict[keyword].update({feature : [pos]})
Run Code Online (Sandbox Code Playgroud)
这是输出:
{'shadyside medical building':
{'Review': [1],
'Video': [1]},
'medical building':
{'Video': [1]}}
Run Code Online (Sandbox Code Playgroud)
所需的输出是:
{'shadyside medical building':
{'Review': [1],
'Video': [1,1]},
'medical building':
{'Video': [1]}}
Run Code Online (Sandbox Code Playgroud)
请注意,视频的第二项已添加到视频列表中.
我想知道如何将嵌套的defaultdict默认为列表[0,0,0]
.例如,我想制作这种分层默认用法.
dic01 = {'year2017': {'jul_to_sep_temperature':[25, 20, 17],
'oct_to_dec_temperature':[10, 8, 7]},
'year2018': {'jan_to_mar_temperature':[ 8, 9, 10].
'apr_to_jun_temperature':[ 0, 0, 0]}
}
Run Code Online (Sandbox Code Playgroud)
为了做这个嵌套的dictioanry,我做了dic01 = defaultdict(dict)
并添加了一个字典作为dic01['year2018']['jan_temperature'] = [8, 9, 10]
.我的问题是,是否可以在不事先绑定[0,0,0]的情况下更新列表的每个元素.在其他工作中,如果我将defaultdict作为defaultdict(dict)
,我必须在使用之前绑定列表[0,0,0],并且我想跳过这个绑定过程.
# The way I do this
dic01['year2018']['jul_to_sep_temperature'] = [0,0,0] # -> how to omit this procedure?
dic01['year2018']['jul_to_sep_temperature'][0] = 25
# The way I want to do this
dic01['year2018']['jul_to_sep_temperature'][0] = 25 # by the end of July
Run Code Online (Sandbox Code Playgroud) 我刚刚注意到 pyhton 中 Enum+defaultdict 的一个非常奇怪的行为。我定义了一个这样的枚举,它收集一些默认字典:
from enum import Enum
from collections import defaultdict
class A(Enum):
a = defaultdict(lambda: 1)
b = defaultdict(lambda: 2)
Run Code Online (Sandbox Code Playgroud)
然后,当我查看 A 里面的内容时:
In [11]: A.a
Out[11]: <A.a: defaultdict(<function A.<lambda> at 0x7f773f03b510>, {})>
In [12]: A.b
Out[12]: <A.a: defaultdict(<function A.<lambda> at 0x7f773f03b510>, {})>
Run Code Online (Sandbox Code Playgroud)
SoA.b
只是 的别名A.a
。对我来说,这看起来很像一个错误,即使背后可能有一些充分的理由。任何想法?
附录
由于它出现在评论中,因此需要说明为什么要在枚举中放入字典。我发现将常量分组到命名空间中通常很有用,这样就可以访问A.a.constant1
、A.b.constant1
等值。目前,尝试使用 Enums 执行此操作会引发AttributeError
. 当然,人们可以这样做:
class A:
class a(Enum):
constant1 = 1
class b(Enum):
constant1 = 2
Run Code Online (Sandbox Code Playgroud)
然而,这并没有利用 Enum 的功能(迭代、访问__getitem__
等)。
我在用 Python 填充空字典时遇到问题
我将字典声明如下:
my_dict = {}
Run Code Online (Sandbox Code Playgroud)
我想一次用不同的键和不同的值填充它。我想最后有这样的东西:
{"1":(1,2,3,4),"2":(4,5,6,7),"3":(8,9,10,11),"4":(12,13,14,15)}
Run Code Online (Sandbox Code Playgroud)
因此我尝试这样做:
for i in range(4):
for j in range(4):
my_dict[str(i)].append(j)
Run Code Online (Sandbox Code Playgroud)
但我在第一个循环时出现以下错误:
KeyError Traceback(最近一次调用最后一次) in () 2 for i in range(4): 3 for j in range(4): ----> 4 my_dict[str(i)].append(j)
KeyError: ' 0'
我的代码中有一个更复杂的 for 循环,但我尝试尽可能更通用,以帮助其他可能遇到类似问题的人。最后我想为每个键设置不同大小的值。
如果您知道为什么它不起作用以及如何修复它,请随时回答。
编辑
抱歉造成混乱,我想要类似以下的内容:
{'1': [1, 2, 3, 4],
'2': [5, 6, 7, 8],
'3': [9, 10, 11, 12],
'4': [13, 14, 15, 16]})
Run Code Online (Sandbox Code Playgroud) 我想创建一个默认的数组字典。问题是,它为每个键使用相同的数组。
# using Pkg
# Pkg.add("DataStructures")
using DataStructures: DefaultDict
genome = DefaultDict{Tuple{String, String}, Array{Int64, 1}}(Int64[])
push!(genome["chr1", "+"], 5)
# 1-element Array{Int64,1}:
# 5
push!(genome["chrX", "-"], 10)
# 2-element Array{Int64,1}:
# 5
# 10
Run Code Online (Sandbox Code Playgroud)
我尝试给它提供一个 lambda 来创建一个新数组x -> Int64
,但这只是给出了类型错误。
有一个python列表
[('schema1', 'table1', 'column_name1'), ('schema1', 'table1', 'column_name2'), ('schema1', 'table2', 'column_name3'), ('schema2', 'table3', 'column_name4')]
Run Code Online (Sandbox Code Playgroud)
我需要将它转换为具有以下结构的python dict
schema1:
table1:
(column_name1,
column_name2)
table2:
(column_name3)
schema2:
table3:
(column_name4)
Run Code Online (Sandbox Code Playgroud)
有没有有效的转换方式?
字符串列表:
['Georgie Porgie', 87, '$$$', ['Canadian', 'Pub Food'], 'Queen St. Cafe', 82, '$', ['Malaysian', 'Thai'], 'Dumplings R Us', 71, '$', 'Chinese', 'Mexican Grill', 85, '$$', 'Mexican', 'Deep Fried Everything', 52, '$', 'Pub Food']
Run Code Online (Sandbox Code Playgroud)
我正在尝试从上面的列表中创建一个cuine_to_names 字典。菜系在索引 3 处,有时是它们自己的迷你清单。餐厅名称在索引 0 处。它们每四个索引重复一次。美食 - 3::4,名称 - 0::4。
我遇到的问题是从索引 3::4 中提取元素并将它们设为键。我认为麻烦来了,因为有时它们是一个字符串的迷你列表,有时它们只是一个字符串。这使得使用 defaultdict 对我来说很困难,但我是学习该功能的新手。我看到其他一些答案包括 setdefault 之类的东西,但我不知道如何在这种特定情况下使用它。任何指导将不胜感激!
我想要这个输出:
Cuisine to list of restaurant names:
# dict of {str, list of str}
{'Canadian': ['Georgie Porgie'],
'Pub Food': ['Georgie Porgie', 'Deep Fried Everything'],
'Malaysian': ['Queen St. Cafe'],
'Thai': ['Queen …
Run Code Online (Sandbox Code Playgroud) 请原谅我以这样一般的方式询问,因为我确信他们的表现取决于他们如何使用它们,但在我的情况下collections.deque
,比collections.defaultdict
我想要验证值的存在时要慢.
我使用Peter Norvig的拼写校正来验证用户对一小组单词的输入.由于我没有使用带有单词频率的字典,所以我使用了一个简单list
而不是defaultdict
一开始,但是deque
一旦我注意到单个单词查找花了大约25秒就用它替换它.
令人惊讶的是,这并不比使用a更快,list
所以我defaultdict
几乎立即返回使用返回的结果.
有人可以向我解释这种性能差异吗?
提前致谢
PS:如果你们中的一个想要重现我正在谈论的内容,请在Norvig的脚本中更改以下行.
-NWORDS = train(words(file('big.txt').read()))
+NWORDS = collections.deque(words(file('big.txt').read()))
-return max(candidates, key=NWORDS.get)
+return candidates
Run Code Online (Sandbox Code Playgroud) defaultdict ×10
python ×9
dictionary ×6
list ×3
python-3.x ×2
alias ×1
append ×1
deque ×1
enums ×1
julia ×1
parsing ×1
performance ×1
setdefault ×1