搜索列表列表 - Python

时间:2012-02-07 04:05:36

标签: python

基本上我已经将制表符分隔的txt文件转换为包含每本书(标题,作者,出版商等)的一堆列表的列表,并且我已经找到了如何使用索引搜索某些内容,但是我如何制作所以它搜索并返回甚至部分匹配的任何内容。

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

EG。因此,不必搜索“汤姆克兰西”,有人可以进入“克莱恩”并仍然得到汤姆克兰西的所有小说。

感谢。

2 个答案:

答案 0 :(得分:1)

我认为这可以实现您的目标:

search = 'Tom Clancy'
for sublist in list_of_books:
    if search in sublist[1]:
        print sublist

更新:

我认为您也希望将两个字符串转换为小写字母,如下所示:

if search.lower() in sublist[1].lower():

答案 1 :(得分:0)

这取决于部分的确切含义。

第一个定义:search术语应该完全匹配,但它可以在字符串中的任何位置匹配。这可能几乎就是你的意思。在这种情况下,您确实要检查子列表是否包含搜索词。为此,您希望使用Python的in运算符:

if search in sublist[1]:
    print sublist

由于相等和包含之间的差异,这将介于略微和非常慢之间。我怀疑这对你很重要。

第二个定义:与第一个相同,但情况无关紧要。在这种情况下,你想要规范化大小写,基本上只是通过使用Pythons 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。这是一个完整的'蠕动的蠕虫。幸运的是,this Stack Overflow question有一大堆可以帮助它的库。