Pythonic替代嵌套字典和列表

时间:2016-03-07 23:48:44

标签: python dictionary

我目前正在使用一个字典键入的字典,因为epoch结合了嵌套字典和列表来存储和查找事件。实力是我可以快速查找具有良好性能的值(想想哈希)。缺点是搜索和操纵后续内容很笨拙。我不禁想到我的方法不是非常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],但代码的其余部分似乎不是非常pythonic。有什么建议或我是偏执​​狂吗?

我应该查看列表中是否已经出现“错误”。但是,我不确定如何检查此构造的成员资格。这段代码对我不起作用:

if error not in D[1][eventCode]

2 个答案:

答案 0 :(得分: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'}}

答案 1 :(得分: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)