2016-04-05 204 views
2

Python辞書で「あいまいな」キー検索を実行できる方法があるかどうかは疑問でした。私は、文字列Python辞書の曖昧なキー検索

name= "Google" or name = "google" or even name = "gooogle" 

を持っていると私は私の辞書に(そのキー「Google.com」である)をvalue1にアクセスしたい場合は

data = { "Google.com" : value1, "StackOverFlow": value2, ....} 

、たとえば、私はこのような辞書を持っていますそれ、どうやったら出来るの?私はキーリストを繰り返し処理することができ、いくつかの文字列処理を行うことができますが、私はそのようなあいまいな検索をしたいという複数の名前を持っているなら、O(n^2)になるでしょうか?それを行うための効率的な方法はありますか?データ辞書が非常に大きいとします。

私の質問は明確です。

+1

1.あなたが探している* "あいまい検索" *ここで

は一例です。 2.はい、かなり効率が悪く、正確なキーハッシュマッチに頼ることができない場合は、辞書を最大限に活用できません。 – jonrsharpe

+0

「google.com」と「Google.com」がある場合は、「oogle.com」と一致するものは何ですか? –

+1

似たような質問がありました:http://stackoverflow.com/questions/17106819/accessing-python-dict-values-with-the-key-start-charactersそしてそれは実装を指摘しました:https://github.com /pywinauto/pywinauto/blob/5176a9eaf568781a0cb8​​700dd020ab8753592e61/pywinauto/fuzzydict.py –

答えて

5

ファジィ検索をしたい場合は、実際に自分のハッシュアルゴリズムを考え出す必要があります。または、辞書の独自のバリアントを作成し、.__getitem__と関連するメソッドをオーバーライドするだけです。

from jellyfish import soundex 

data = {soundex('google'): 'google.com', soundex('stackoverflow'): 'stackoverflow.com'} 
print(data[soundex('gooooogle')]) 
# Should print `google.com`, because soundex pretty much ignores vowels 

または代替:

from jellyfish import soundex 

class SoundexDict(dict): 
    # __init__ and __repr__ is left as an exercise for the reader 
    def __getitem__(self, key): 
     return super().__getitem__(soundex(key)) 

    def __setitem__(self, key, value): 
     super().__setitem__(soundex(key), value) 

mydict = SoundexDict() 
mydict['google'] = 'google.com' 
print(mydict['gewgle']) # prints 'google.com' 
+0

このような構文を使用してデータ・ディクショナリを移入することは違法と思われる:データ[SOUNDEX(名)] –

+0

私が意味する、私はTypeError例外取得しています:予想Unicodeは、strの –

+0

を得ましたあなたはおそらくPython2を使用しています。おそらく、 'mydict [u'google '] =' google.com 'を使うか、' soundex(key.encode()) 'や何かをするようにセッターを調整する必要があります。 –

0

検索すると効率的な曖昧なキーはありません。 Pythonの辞書は、辞書内の場所を見つけるためにハッシュを使います。ハッシュは、同様の文字列ではかなり異なっています。見てみよう:

assert hash("Google.com") == 4399753695393964520 
assert hash("Google.co") == -9213236188503134626 

少なくとも私のOSでは。

結論:似たようなキーを使用することで、希望する値に "近く"なることはほとんどありません。

So:いいえ。 dictsを使ってO(n^2)を避けることはできません。