查找给定值的所有键 我试图把代码从C++移植到Python。< /P>
我有一本字典,其中键是12000个英语单词,每个键的值是一个可能的键组合列表,其中缺少字母。例如,“DOG”和“DAD”的键值对是: 我试图创建一种“哈希表”,给定一个值,它将返回所有可能匹配的键。例如,如果我请求“D--”,函数将返回“DOG”和“DAD” 我可以使用列表理解将所有值展平并将键添加到列表中,但这是最快的方法吗查找给定值的所有键 我试图把代码从C++移植到Python。< /P>,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我有一本字典,其中键是12000个英语单词,每个键的值是一个可能的键组合列表,其中缺少字母。例如,“DOG”和“DAD”的键值对是: 我试图创建一种“哈希表”,给定一个值,它将返回所有可能匹配的键。例如,如果我请求“D--”,函数将返回“DOG”和“DAD” 我可以使用列表理解将所有值展平并将键添加到列表中,但这是最快的方法吗 def find_word(s): my_keys = [] tmp = [k,v for sublist in list(my_dic.values()
def find_word(s):
my_keys = []
tmp = [k,v for sublist in list(my_dic.values() for k,v in sublist]
if s in tmp:
my_keys.append(k)
return my_keys
您可以只返回一个,注意这与您当前的解决方案具有相同的时间复杂性:
my_dict = {
"DOG": ["DOG", "DO-", "D-G", "D--", "-OG", "--G", "-O-", "---"],
"DAD": ["DAD", "DA-", "D-D", "D--", "-AD", "--D", "-A-", "---"]
}
def find_keys(search_value):
return [
key
for key, values in my_dict.items()
if search_value in values
]
如果您将在my_dict
中重复查找键,您可能希望使用创建一个数据结构,该结构是O(1)
查找时间的反向映射,请注意此反向映射dict
的创建是O(M*N)
其中M
是键的数量,N
是最长列表的长度,因此您只能执行一次,而不能在查找键
功能内部执行:
from collections import defaultdict
my_dict = {
"DOG": ["DOG", "DO-", "D-G", "D--", "-OG", "--G", "-O-", "---"],
"DAD": ["DAD", "DA-", "D-D", "D--", "-AD", "--D", "-A-", "---"]
}
my_dict_reversed = defaultdict(list)
for key, values in my_dict.items():
for value in values:
my_dict_reversed[value].append(key)
def find_keys(search_value):
return my_dict_reversed[search_value]
用法示例:
>>> find_keys("D--")
['DOG', 'DAD']
最后,作为一个旁注,您可能想考虑将<代码> DICT<代码>作为一个参数,以<代码> FIDKEXKEY 而不是调用一个全局声明的变量<代码> DICT<代码>以供重用,但我相信这超出了原问题的范围。
< P> > <代码> DICT<代码>是一个哈希表,但它将关键映射到值。您需要反向映射: 然后用这句话:print(rev_dic["D--"])
当然,不要每次要进行此类查询时都进行反向映射,请提前单独创建此dict,并继续重复使用它
因此:
或者,您可能会引发错误,可能是ValueError:
def find_words(s):
try:
return re_dic[s]
except KeyError:
raise ValueError("Some helpful message")
现在,您的查找是固定时间(当然,您已经使用了辅助空间,这是一种类权衡)。Thx很多。真快!这仍然是一个线性时间的外观。@ShashSinha你不必这么做吗?最后到达了XD。。。为了不重复你的答案,我使用了
defaultdict
。
print(rev_dic["D--"])
def find_words(s, default=None):
return rev_dic.get(s)
def find_words(s):
try:
return re_dic[s]
except KeyError:
raise ValueError("Some helpful message")