Поиск небольшого списка строк в большом списке строк (Python) - PullRequest
2 голосов
/ 24 мая 2011

Привет, я новичок в Python, так что это может показаться простой проблемой, но я много раз искал в Google и, похоже, не могу найти способ ее преодолеть.В основном у меня есть список строк, взятых из файла 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

Искажем, текстовый файл выглядит следующим образом: Romance 2003

Я пытаюсь создать функцию, которая возвращает имена книг, в которых есть слова «Romance» и «2003».Так что в этом случае он должен вернуть «Private Series» и «Geisha», но не «Mockingbird».Но моя проблема в том, что они не возвращают их.Однако, когда я изменяю свой ввод на «Романтика», он возвращает все три книги с романсами в них.Я предполагаю, что это потому, что "Romance 2003" не вместе, потому что, если я изменю свой ввод на "Mary Door", появятся "Goosebumps" и "Geisha".Так как я могу преодолеть это?

Кроме того, как сделать мою функцию нечувствительной к регистру?

Любая помощь будет высоко ценится:)

1 Ответ

3 голосов
/ 24 мая 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...