Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找给定值的所有键 我试图把代码从C++移植到Python。< /P>_Python_Python 3.x_Dictionary - Fatal编程技术网

查找给定值的所有键 我试图把代码从C++移植到Python。< /P>

查找给定值的所有键 我试图把代码从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()

我有一本字典,其中键是12000个英语单词,每个键的值是一个可能的键组合列表,其中缺少字母。例如,“DOG”和“DAD”的键值对是:

我试图创建一种“哈希表”,给定一个值,它将返回所有可能匹配的键。例如,如果我请求“D--”,函数将返回“DOG”和“DAD”

我可以使用列表理解将所有值展平并将键添加到列表中,但这是最快的方法吗

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")