在Python中查找列表中的列表

0 投票
2 回答
3172 浏览
提问于 2025-04-17 12:28

基本上,我把一个用制表符分隔的文本文件转换成了一个列表,这个列表里面包含了每本书的信息,比如书名、作者、出版社等等。我已经弄明白了怎么用索引来搜索,但我想知道怎么才能让搜索功能更灵活,能够找到部分匹配的内容。

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():

撰写回答