2017-04-09 11 views
0

我有一個元組作爲鍵的字典。元組內部是一個數字和正則表達式。作爲鍵的元組對應於任何值。我想使用元組(即正則表達式)作爲鍵來訪問該值。例如,如何在字典中使用正則表達式作爲鍵,以及如何使用它進行訪問?

import re 

t_dict = dict() 
t[(1, r"[0-9]+")] = "Hello world!" 
t[(2, r"[a-z]+")] = "Hi!" 

我在正確的表達方式上做了正確的事情嗎?如果不是的話,你如何在上面加一個正則表達式?

接下來是我想要使用鍵獲取字典中的值。例如,我想這樣做。

print t[(1, '99')] # this should print "Hello world!" 
print t[(2, 'hey')] # this should print "Hi!" 
+6

沒有內置的支持您的用例。由於字典只是一個關鍵值對,因此不存在這種基於模式的支持。而且,這也不是一個體面的數據結構。也許你可以從更高層面告訴我們你的用例,所以我們可能會建議你採用不同的方法。 –

+1

這沒有意義;字典的一點是它是一個散列表,所以你可以在'O(1)'中用鍵查找值。你可以編寫一個你想要的數據結構,但它必須對正則表達式「鍵」進行'O(n)'掃描以找到匹配的值。 – jonrsharpe

+0

對不起,我不明白你的意思,先生。我發現了一個類似t [(1,'a')] =「Hello World!」的代碼,t [(2,'b')] =「Hi!」。因此,檢索值「Hello World」只是t [(1,'a')]。 我試圖模擬使用字典作爲我的DFA轉換列表的DFA。所以,我在那裏寫的正則表達式意味着「從0-無限的任何數字」,而所有的字符串只有來自a-z的字母。 –

回答

1

做你想做什麼,你也可以繼承內置的字典,然後覆蓋它的__getitem__方法有你想要的那種查找。

這種方法的問題在於,由於Python的內置哈希函數不理解正則表達式(我不知道任何哈希是什麼),因此您將無法重現O(1)查找實際字典。

有沒有簡單的方法有一個O(1)(恆定時間)反向查找來找到哪個正則表達式匹配一個字符串。除非實際嘗試過,否則無法知道正則表達式是否匹配字符串。

+0

查找時間將非常接近O(1)因爲唯一的額外開銷是將正則表達式應用於提供的密鑰。無論如何,如果它包含的代碼顯示如何**重寫**從'dict'基類繼承的'__setitem __()'方法,我會贊成你的答案。 – martineau

+0

@martineau,''查找時間將非常接近O(1),因爲唯一的額外開銷就是將正則表達式應用於提供的鍵。「不完全的。您必須針對* every *正則表達式來測試輸入字符串的查找,因爲它們中的任何一個都可以匹配。不能保證輸入查找字符串只匹配其中一個正則表達式,即使有,也沒有辦法在沒有實際檢查每個正則表達式的情況下進行檢查。 – ffledgling

+0

@martineau,''查找時間將非常接近O(1),因爲唯一的額外開銷是將正則表達式應用於提供的鍵。「不完全的。您必須針對* every *正則表達式來測試輸入字符串的查找,因爲它們中的任何一個都可以匹配。不能保證輸入查找字符串只匹配其中一個正則表達式,即使有,也沒有辦法在沒有實際檢查每個正則表達式的情況下進行檢查。 – ffledgling

相關問題