在Python中查找列表中的列表
基本上,我把一个用制表符分隔的文本文件转换成了一个列表,这个列表里面包含了每本书的信息,比如书名、作者、出版社等等。我已经弄明白了怎么用索引来搜索,但我想知道怎么才能让搜索功能更灵活,能够找到部分匹配的内容。
import csv
import itertools
list_of_books = list(csv.reader(open('bestsellers.txt','rb'), delimiter='\t'))
search = 'Tom Clancy'
for sublist in list_of_books:
if sublist[1] == search:
print sublist
举个例子,用户不需要输入完整的“Tom Clancy”,只要输入“clancy”也能找到所有的汤姆·克兰西的小说。
谢谢。
2 个回答
0
这有点儿取决于你说的部分匹配具体是什么意思。
第一种定义:搜索的词要完全匹配,但可以在字符串的任何位置匹配。这可能就是你想要的。在这种情况下,你实际上是想检查子列表中是否包含这个搜索词。为此,你可以使用Python的in
运算符:
if search in sublist[1]:
print sublist
由于相等和包含之间的区别,这个操作的速度可能会有点慢,甚至非常慢。我想这对你来说应该没什么影响。
第二种定义:和第一种一样,但不区分大小写。在这种情况下,你需要统一大小写,基本上就是把所有字母都变成一样的,可以使用Python的lower
(或upper
)字符串方法。
search = 'Tom Clancy'
search_lower = search.lower() # move the search lowering
for sublist in list_of_books:
# since strings are immutable, sublist[1].lower() creates a new lower-cased
# string to be compared against search_lower. sublist[1] doesn't get modified
if search_lower in sublist[1].lower():
print sublist
这可能就是你想要的。
还有第三种定义,就是“模糊匹配”。如果你接受模糊匹配,clincy
可能会匹配到Clancy
。甚至如果模糊程度足够高,tom
也可能匹配到Clancy
。这就复杂多了。幸运的是,这个Stack Overflow的问题提供了很多可以帮助你的库。
1
我觉得这个可以满足你的需求:
search = 'Tom Clancy'
for sublist in list_of_books:
if search in sublist[1]:
print sublist
更新:
我觉得你还需要把两个字符串都转换成小写,像这样:
if search.lower() in sublist[1].lower():