2012-02-07 69 views
0

基本上我已經將製表符分隔的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。因此,不必搜索'湯姆克蘭西',有人可以進入'克蘭西',仍然可以得到所有湯姆克蘭西的小說。

謝謝。

回答

1

我想,這達到你在找什麼:

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

UPDATE:

我想你會想這兩個字符串轉換爲小寫過,像這樣:

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

啊,是的。謝謝。另一組眼睛總是有幫助! – sharkman 2012-02-07 04:11:30

+0

是的,我知道要這樣做! :) – sharkman 2012-02-07 04:13:21

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有一大堆可以幫助它的庫。