2016-03-07 102 views
4

我目前正在使用一个词典键入秒自从时代结合嵌套字典和列表来存储和查找事件。实力在于,我可以快速查找具有良好性能的值(认为哈希值)。弱点在于搜索和操纵后续内容很笨拙。我忍不住想我的方法并不是Pythonic,所以我在寻找建议。Pythonic替代嵌套字典和列表

下面是使用整数,而不是秒纪元以来的一个简单的例子:

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] 
+0

是否有特殊原因来定义d为'dict'而不是'list'? – Selcuk

+1

最后一个片段应该可以正常工作。 –

+1

订单是否在列表中很重要?如果不是,请考虑使用集合,它具有更快的查找和自动欺骗预防功能,尽管集合比列表消耗更多的RAM。 –

回答

2

我不知道如果这是你想要的,但你可以改变列表与sets处理重复和使用dict.get跳过检查,如果项是否存在:

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'}} 
+0

为了确认,你的建议是结合字典与套,而不是我目前使用的名单? D [1] = {“995”:{“20905”,“200101”}} –

+0

@Notamachine,如果你不想在你的列表中重复和顺序无关紧要,你最好使用set而不是list 。 –

1

除了其他建议,你可以使用defaultdict并设置以这样的方式

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) 
+0

这两个答案都很好。让我把它们编码,看看哪个更自然。 –

+0

'(lambda:defaultdict(lambda:None)'后面的逻辑是什么? –

+0

@ mtk99对D.keys()中的k进行迭代的首选方法是什么?产生输出“6 defaultdict( at 0x005C09C0>,{'995':{'90900'}})“ –