用于搜索inpu的Python搜索字典键

2024-06-07 17:41:48 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我的问题是:

我想搜索字典,看看是否有任何键包含用户输入的关键字。例如,用户搜索John。

elif option == 3:
        count = 0
        found = None
        search_key = input("What do you want to search for? ").lower()
        for key, val in telephone_directory.items(): #takes each element in telephone directory
            if search_key in key: #checks if it contains search_key
                if found is None:
                    found = val
                    count = 1
                if found is not None:
                    print(" ")
                    print("More than one match found. Please be more specific.")
                    print(" ")
                    count = 2
                    break

            if found is None:
                print("Sorry, " + str(search_key) + " was not found.")
                print(" ")
                function_options() #redirects back

            if found is not None and count < 2:
                print(str(search_key) + " was found in the directory.")
                print("Here is the file on " + str(search_key) + ":")
                print(str(search_key) + ":" + " " + telephone_directory[search_key])
                print(" ")
                function_options() #redirects back  

所以我现在就在这里。不管搜索结果是什么,即使它是整个密钥,它也会返回“was not found”。我做错什么了?


Tags: key用户innonesearchifiscount
1条回答
网友
1楼 · 发布于 2024-06-07 17:41:48

您需要做出一些选择:允许多个匹配,只查找第一个匹配,或者最多只允许一个匹配。

要查找第一个匹配项,请使用next()

match = next(val for key, val in telephone_directory.items() if search_key in key)

如果找不到匹配项,这将引发StopIteration;请返回默认值或捕获异常:

# Default to `None`
match = next((val for key, val in my_dict.items() if search_key in key), None)

try:
    match = next(val for key, val in telephone_directory.items() if search_key in key)
except StopIteration:
    print("Not found")

这些版本只循环字典项,直到找到匹配项,然后停止;完整的for循环等价物为:

for key, val in telephone_directory.items():
    if search_key in key:
        print("Found a match! {}".format(val))
        break
else:
    print("Nothing found")

注意else块;它只在for循环被允许完成且未被break语句中断时调用。

要查找所有匹配键,可以使用列表理解:

matches = [val for key, val in telephone_directory.items() if search_key in key]

最后,为了有效地只允许一个匹配,在同一个迭代器上使用两个next()调用,并在发现第二个匹配时引发错误:

def find_one_match(d, search_key):
     d = iter(d.items())
     try:
         match = next(val for key, val in d if search_key in key)
     except StopIteration:
         raise ValueError('Not found')    

     if next((val for key, val in d if search_key in key), None) is not None:
         raise ValueError('More than one match')

     return match

再次将其适应于for循环方法,仅当找到第二个项时才需要中断:

found = None
for key, val in telephone_directory.items():
    if search_key in key:
        if found is None:
            found = val
        else:
            print("Found more than one match, please be more specific")
            break
else:
    if found is None:
        print("Nothing found, please search again")
    else:
        print("Match found! {}".format(found))

您的版本不起作用,因为您为每个不匹配的键打印“未找到”。只有在遍历字典中的所有键之后,才能知道匹配键。

相关问题 更多 >

    热门问题