2016-03-07 152 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'}})「 –