我正在创建由导入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.")
答案 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.")