嗨,我是Python的新手,所以这可能是一个简单的问题,但我一直在谷歌搜索多次,我似乎无法找到克服它的方法。 基本上我有一个从CSV文件中获取的字符串列表。我在文本文件中有另一个字符串列表。我的工作是查看我的文本文件中的单词是否在CSV文件中。
假设这是CSV文件的样子(它已经组成):
name,author,genre,year
Private Series,Kate Brian,Romance,2003
Mockingbird,George Orwell,Romance,1956
Goosebumps,Mary Door,Horror,1990
Geisha,Mary Door,Romance,2003
让我们说文本文件如下所示: 浪漫 2003
我要做的是创建一个函数,该函数返回一本书中包含“Romance”和“2003”字样的书名。所以在这种情况下,它应该返回“私人系列”和“艺伎”而不是“模仿鸟”。但我的问题是,它似乎没有返回它们。然而,当我将我的输入改为“浪漫”时,它会返回所有三本带有浪漫的书。我认为这是因为“浪漫2003”不在一起,因为如果我改变我对“玛丽门”的输入,“Goosebumps”和“Geisha”都会出现。那我怎么能克服这个呢?
另外,如何使我的功能不敏感?
非常感谢任何帮助:)
答案 0 :(得分:3)
import csv
def read_input(filename):
f = open(filename)
return csv.DictReader(f, delimiter = ',')
def search_filter(src, term):
term = term.lower()
for s in src:
if term in map(str.lower, s.values()):
yield s
def query(src, terms):
terms = terms.split()
for t in terms:
src = search_filter(src, t)
return src
def print_query(q):
for row in q:
print row
我试图将逻辑分成小的,可重复使用的功能。
首先,我们read_input
采用文件名并将CSV文件的行返回为dicts
的可迭代。
search_filter
使用给定的术语过滤结果流。搜索项和行值都会更改为小写以进行比较,以实现与案例无关的匹配。
query
函数接受一个查询字符串,将其拆分为搜索字词,然后根据这些字词创建一系列过滤器,并返回最终的,已过滤的可迭代字符串。
>>> src = read_input("input.csv") >>> q = query(src, "Romance 2003") >>> print_query(q) {'genre': 'Romance', 'year': '2003', 'name': 'Private Series', 'author': 'Kate Brian'} {'genre': 'Romance', 'year': '2003', 'name': 'Geisha', 'author': 'Mary Door'}
请注意,上述解决方案仅返回完整匹配。如果你想要,例如使用搜索查询“Roman 2003”返回上面的匹配器,然后您可以使用search_filter
的替代版本:
def search_filter(src, term):
term = term.lower()
for s in src:
if any(term in v.lower() for v in s.values()):
yield s