我正在嘗試制作一個程式,該程式在字典中的字串和鍵之間輸出最長的公共后綴字串。
簡單的例子:字典有大約 6000 個鍵:值對,所以我不會包括整個字典。有關資訊,密鑰長度為 2 到 7 個字符。
codeCountry = {
'AFHAS': 'AFGHANISTAN',
'AXUYFF': '?LAND ISLANDS',
'ALUU': 'ALBANIA',
'DZBG': 'ALGERIA',
'ASSQ': 'AMERICAN SAMOA',
'ADDD': 'ANDORRA',
'ANGO': 'ANGOLA',
'ANGI': 'ANGUILLA',
'AQ': 'ANTARCTICA',
'AG': 'ANTIGUA AND BARBUDA',
'AMENI': 'ARMENIA',
'AURI': 'ARUBA',
'AUR': 'ARGENTINA',
'AURII': 'AUSTRALIA'
...
}
作為字串,我將以“AMAURI”為例,因此更清晰(字串是隨機生成的,長度從一個字符到 16 個不等,但它始終包含字典中的后綴(鍵)之一):
strToUse = "AMAURI"
預期結果:“ARUBA”,因為字串和字典中鍵之間最長的公共后綴是“AURI”,所以 -> “AURI”:“ARUBA”。
我該怎么做這是python?我嘗試過這樣的事情(我是 python 新手):
for country in codeCountry:
if country in strToUse:
print(codeCountry.get(country))
但這列印出“ARGENTINA”這是不正確的,我不明白為什么。stackoverflow 上也有類似的問題,但我的問題有所不同,因為它尋找后綴,而不僅僅是字串中的任何字符。我希望我很清楚,我自己真的很困惑,不知道該怎么做,有人可以幫我嗎?或者至少指出我正確的方向?
uj5u.com熱心網友回復:
您可以先按長度對鍵進行排序,然后再檢查它們
strToUse = "AMAURI"
for country in sorted(codeCountry.keys(),key=len,reverse=True):
if country in strToUse:
print(codeCountry.get(country))
break
ARUBA
uj5u.com熱心網友回復:
試試下面的代碼,看看它是否適合你。stringSubsets() 回傳一組可以從您的輸入字串(在您的示例中為“AMAURI”)構造的所有可能的鍵(國家代碼)。然后在 codeCountry dict 上使用集合交集來提供與 stringSubsets() 回傳的集合中的子字串匹配的所有鍵。最后一行中的列印陳述句顯示了如何提取最大匹配鍵的值,或者如果不匹配則回傳 None 以避免鍵錯誤。
如果由于某種原因您的輸入字串(在本例中為“AMAURI”)過長并且您需要加快代碼速度,那么您可以使用更高級的東西,例如 Aho Corasick 演算法。如果你走這條路,你可能能夠顛倒你的方法并實際在你的輸入字串中搜索你的字典中最長的鍵(與搜索 dict 尋找子字串)。這可以很好地作業,因為您的 codeCountry dict 可能不會經常更改,因此可以使用您的 dict 鍵提前構建 Aho Corasick 用于運行的 trie,從而使您對輸入字串的搜索速度非常快。
codeCountry = {
'AFHAS': 'AFGHANISTAN',
'AXUYFF': '?LAND ISLANDS',
'ALUU': 'ALBANIA',
'DZBG': 'ALGERIA',
'ASSQ': 'AMERICAN SAMOA',
'ADDD': 'ANDORRA',
'ANGO': 'ANGOLA',
'ANGI': 'ANGUILLA',
'AQ': 'ANTARCTICA',
'AG': 'ANTIGUA AND BARBUDA',
'AMENI': 'ARMENIA',
'AURI': 'ARUBA',
'AUR': 'ARGENTINA',
'AURII': 'AUSTRALIA'
}
def stringSubsets(s):
out = set()
for i in range(len(s)):
for j in range(i 1, len(s) 1):
out.add(s[i:j])
return out
code = "AMAURI"
candidates = stringSubsets(code)
keys = candidates.intersection(codeCountry)
# results in None if no substring matches a key in dict, else give the
# value of the longest matching key
print(None if not keys else codeCountry[max(keys)])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/373936.html
上一篇:無法從字典python中獲取資料
