Решение удалить дубликаты?

1

Мой код ниже. В принципе, у меня есть файл CSV и текстовый файл "input.txt". Я пытаюсь создать приложение Python, которое будет принимать входные данные из "input.txt" и искать через CSV файл для соответствия, и если совпадение найдено, тогда он должен вернуть первый столбец CSV файла.

import csv
csv_file = csv.reader(open('some_csv_file.csv', 'r'), delimiter = ",")
header = csv_file.next()
data = list(csv_file)

input_file = open("input.txt", "r")
lines = input_file.readlines()
for row in lines:
    inputs = row.strip().split(" ")
    for input in inputs:
        input = input.lower()
        for row in data:
            if any(input in terms.lower() for terms in row):
                print row[0]

Скажите, что мой CSV файл выглядит так:

 book title, author 
 The Rock, Herry Putter
 Business Economics, Herry Putter    
 Yogurt, Daniel Putter
 Short Story, Rick Pan

И скажите, что мой файл input.txt выглядит так:

 Herry
 Putter

Поэтому, когда я запускаю свою программу, она печатает:

 The Rock
 Business Economics
 The Rock
 Business Economics
 Yogurt

Это потому, что он сначала ищет все заголовки с именем "Herry", а затем снова ищет "Putter". Поэтому, в конце концов, у меня есть дубликаты названий книг. Я пытаюсь найти способ удалить их... так что если кто-то может помочь, это будет очень полезно.

Теги:

4 ответа

4

Если исходный порядок не имеет значения, сначала вставьте результаты в набор, а затем распечатайте их в конце. Но ваш пример достаточно мал, где скорость не имеет значения.

3

Придерживайте результаты в наборе (который похож на список, но содержит только уникальные элементы) и печатает в конце.

Что-то вроде:

if any(input in terms.lower() for terms in row):
    if not row[0] in my_set:
        my_set.add(row[0])
2

Во время поиска вы увидите список и добавьте новые результаты в список после первого поиска в списке, чтобы увидеть, есть ли результат. Затем после выполнения поиска распечатайте список.

  • 2
    Вместо этого я бы предложил словарь (при условии, что названия книг уникальны), поскольку время доступа должно быть меньше, чем повторное сканирование списка записей. В остальном хорошо.
1

Сначала выберите набор поисковых запросов, которые вы хотите найти в одном списке. Мы используем set(...) здесь для устранения повторяющихся терминов поиска:

search_terms = set(open("input.txt", "r").read().lower().split())

Затем перебираем строки в таблице данных, выбирая каждый из них, соответствующий условиям поиска. Здесь я сохраняю поведение исходного кода, так как мы ищем искомый случайный случай поиска в любом столбце для каждой строки. Если вы просто хотите выполнить поиск, например. столбец автора, тогда это нужно будет изменить:

results = [row for row in data
              if any(search_term in item.lower()
                     for item in row
                     for search_term in search_terms)]

Наконец, распечатайте результаты.

for row in results:
    print row[0]

Если вы хотите, вы также можете перечислить авторов или любую другую информацию в таблице. Например:.

for row in results:
    print '%30s (by %s)' % (row[0], row[1])
  • 0
    Обратите внимание, что это решение отличается от некоторых других перечисленных решений тем, что если два автора написали книги с одинаковыми именами, то это решение (намеренно) напечатает его дважды, тогда как другие решения напечатают его только один раз. Какое решение вы используете, зависит от того, какое поведение вы хотите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню