Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pythonic替代嵌套字典和列表_Python_Dictionary - Fatal编程技术网

Pythonic替代嵌套字典和列表

Pythonic替代嵌套字典和列表,python,dictionary,Python,Dictionary,我目前正在使用一个自epoch起秒数键控的字典,结合一个嵌套字典和列表来存储和查找事件。其优点是我可以快速查找性能良好的值(想想hash)。缺点是搜索和操作后续内容很笨拙。我忍不住认为我的方法不太符合Python,所以我正在寻找建议 下面是一个简单的例子,使用整数而不是从历元开始的秒数: D = {} D[1] = {"995" : ["20905", "200101"]} D[2] = {"991" : ["20901"], "995" : ["20905"]} eventCode = '

我目前正在使用一个自epoch起秒数键控的字典,结合一个嵌套字典和列表来存储和查找事件。其优点是我可以快速查找性能良好的值(想想hash)。缺点是搜索和操作后续内容很笨拙。我忍不住认为我的方法不太符合Python,所以我正在寻找建议

下面是一个简单的例子,使用整数而不是从历元开始的秒数:

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]不存在,它会被创建和填充吗?