如何使用部分字符串匹配而不区分大小写来搜索词典列表,然后显示结果?

时间:2019-04-01 03:36:42

标签: python python-3.x

我正在创建由导入csv文件创建的两个列表的字典。两个列表中的每一个都包含多个词典列表,每个条目有8个key:value对。每本词典都包含有关一个特定项目的信息。列表之一是有关多本书的信息。另一个是有关多部电影的信息。

我需要通过允许用户输入查询字符串来查询书籍列表,该查询字符串将用于对书籍列表中的多个字段进行搜索。搜索需要执行部分字符串匹配,并且不区分大小写。应显示所有匹配书籍的所有详细信息,而无需重复任何输入。

如果字典与查询字符串匹配,如何搜索列表并打印整个字典?

Settings - Tools - Device File Explorer - Download location

使用我现在编码的方式,我希望它只匹配完整的直接匹配(而不是部分字符串匹配),然后打印完整的book_collection。但是,它只会打印“对不起,该搜索没有返回结果。”

编辑:我已将query_string.lower更新为query_string.lower()。

书籍字典有22个清单,我相信每个清单都是一本字典。一个列表(来自调试器)如下所示:

:{“标题”:“我有史以来最好的书”,“作者”:“约瑟夫·考德威尔”,“出版者”:“ FPG出版”,“页面”:“ 317”,“年份”:“ 2014”, '份数':3,'可用':3,'ID':17001}

目标是能够搜索任何短语,如果该短语出现在上面的词典中,则将打印整个词典。

对于那些询问的人,这里有更多的代码可以提供更大的上下文。我最初共享的代码位于长打印菜单的正下方:

# Note to self: book_collection is a list
# ORDER OF INFO in book_collection: title, author, publisher, pages, year, copies, available, ID
def query_book_collection(book_collection):
    # check to see if the string is in the dictionary--partial string matching and case insensitive
    query_string = input("Enter a query string to use for the search: ")

   if query_string.lower() in book_collection:
        print(book_collection)
   else:
        print("Sorry, that search returned no results.")

2 个答案:

答案 0 :(得分:0)

要匹配子字符串,您需要分别检查每本书的每个值。这可以通过循环和列表理解来完成:

found = False
for book in book_collection:
    if any([query_string.lower() in str(val).lower() for val in book.values()]):
        print(book_collection)
        found == True
if not found:
    print("Sorry, that search returned no results.")

str(val)是必需的,因为book_collection中的某些数据不是字符串。

答案 1 :(得分:0)

在使用in操作符之前,您可以将集合中的所有值连接在一起:

def query_book_collection(book_collection):
    query_string = input("Enter a query string to use for the search: ")
    collection_string = ",".join(map(str, book_collection.values())).lower()

    if query_string.lower() in collection_string:
        print(book_collection)
    else:
        print("Sorry, that search returned no results.")

,但是更有效的方法应该是添加一个新属性,当您将集合加载到book_collection函数中时,该属性将合并所有要查询到load_collection的值。喜欢(使用python buildin csv模块读取csv文件):

def load_collection(file_name):
    try:
        with open(file_name, "r") as f:
            reader = csv.DictReader(f)
            collection = []
            max_id = -1

            for item in reader:
                # add a field for querying
                item["_fulltext"] = ",".join(item.values())

                # casting type
                item["Available"] = int(item["Available"])
                item["Copies"] = int(item["Copies"])
                item["ID"] = int(item["ID"])

                collection.append(item)
                max_id = max(max_id, item["ID"])

            return collection, max_id

    except FileNotFoundError:
        print("File not found when attempting to read", file_name)
        return None, None
    except IOError:
        print("Error in data file when reading", file_name)
        return None, None

然后,您的查询功能将是:

def query_book_collection(book_collection):
    query_string = input("Enter a query string to use for the search: ")

    if query_string.lower() in book_collection["_fulltext"]:
        print(book_collection)
    else:
        print("Sorry, that search returned no results.")