Pythonic替代嵌套字典和列表
我目前正在使用一个自epoch起秒数键控的字典,结合一个嵌套字典和列表来存储和查找事件。其优点是我可以快速查找性能良好的值(想想hash)。缺点是搜索和操作后续内容很笨拙。我忍不住认为我的方法不太符合Python,所以我正在寻找建议 下面是一个简单的例子,使用整数而不是从历元开始的秒数:Pythonic替代嵌套字典和列表,python,dictionary,Python,Dictionary,我目前正在使用一个自epoch起秒数键控的字典,结合一个嵌套字典和列表来存储和查找事件。其优点是我可以快速查找性能良好的值(想想hash)。缺点是搜索和操作后续内容很笨拙。我忍不住认为我的方法不太符合Python,所以我正在寻找建议 下面是一个简单的例子,使用整数而不是从历元开始的秒数: D = {} D[1] = {"995" : ["20905", "200101"]} D[2] = {"991" : ["20901"], "995" : ["20905"]} eventCode = '
D = {}
D[1] = {"995" : ["20905", "200101"]}
D[2] = {"991" : ["20901"], "995" : ["20905"]}
eventCode = '995'
error = '90900'
# find entry
if 1 in D:
# if eventCode exists then append error code
if D[1][eventCode]:
D[1][eventCode].append(error)
我可以很快地查找D[1],但是代码的其余部分似乎不是很像Python。有什么建议吗?或者我是偏执狂
我应该检查一下列表中是否已经有“错误”。但是,我不确定如何检查此构造中的成员资格。此代码段不适用于我:
if error not in D[1][eventCode]
我不确定这是否是您想要的,但您可以使用更改列表以处理重复项,并使用跳过检查键是否存在:
D = {"995" : {"20905", "200101"}} # dict: str -> set
# 1) event code not exists, nothing changes:
D.get('111', set()).add('7777')
print(D) # {'995': {'20905', '200101'}}
# 2) event code exists, error already present, nothing changes:
D.get('995', set()).add('20905')
print(D) # {'995': {'20905', '200101'}}
# 3) event code exists, error not present, error will be added:
D.get('995', set()).add('7777')
print(D) # {'995': {'20905', '7777', '200101'}}
除了其他建议外,您还可以通过以下方式使用defaultdict和Set:
from collections import defaultdict
D = defaultdict(lambda: defaultdict( lambda: None))
D[1] = {"995" : {"20905", "200101"}}
D[2] = {"991" : {"20901"}, "995" : {"20905"}}
eventCode = '995'
error = '90900'
tmp = D[1][eventCode]
if tmp is None:
D[1][eventCode]={error}
else:
tmp.add(error)
是否有特殊原因将D定义为
dict
而不是列表
?最后一个代码段应该可以正常工作。列表中的顺序重要吗?如果不是,考虑使用SET代替,它具有更快的查找和自动防止DUPE,虽然SET消耗的RAM比列表多一些。塞尔库克-一份清单能提供什么,而一份口述却不能提供什么?@Selcuk我想是因为时间稀少。示例中的数字已更改。为了确认,您的建议是将dict与集合相结合,而不是与我当前使用的列表相结合?D[1]={“995”:{“20905”,“200101”}@Notamachine,如果您不希望列表中出现重复项,并且顺序也不重要,那么最好使用set而不是list。这两个答案都非常好。让我对它们进行编码,看看哪个更自然。背后的逻辑是什么(lambda:defaultdict(lambda:None)
?@mtk99迭代集合的首选方法是什么?对于D中的k。keys()生成输出“6 defaultdict(,{995':{90900'})”@NOTACHINE,不要调用.keys,你可以通过迭代D来迭代dict中的键,这段代码也是一种循环的@PadraicCunningham方法,非常好和整洁!我想如果D[1]不存在,它会被创建和填充吗?