2013-12-05 5 views
2

Я получаю фид данных из внешнего источника, который может содержать повторяющиеся значения.Python: Dedup список на основе определенных критериев

hash, date, address, name 

foo, 11/1/2013, 123 blah street, Jason 
foo1, 11/15/2013, 15 foo road, Greg 
foo, 11/2/2013, 123 blah street, Jason 

Целью здесь является «DeDup» в первой колонке (так называемый хэш), но я хочу взять строку с «последней» даты. В этом случае было бы:

foo, 11/2/2013, 123 blah street, Jason 

Я не могу просто использовать сборку в список функций (если я полностью пропустил один), так что я пытаюсь придумать другой способ. Может быть, итерировать через список и сравнить значения?

Любая помощь была бы очень оценена.

Спасибо.

ответ

4

Сделайте dict, при этом ключ будет вашим столбцом «хэш», а значения будут целыми. Для каждой строки посмотрите, находится ли она в dict; если нет, вставьте его. Если он есть, замените существующее значение, если дата будет позже.

Если вам нужно, чтобы выходной сигнал был заказан аналогично входу, используйте OrderedDict вместо обычного.

+0

хорошая идея, но что было бы хорошим способом сравнить, если одна дата более поздняя, ​​чем другая? –

+1

@ Формат датыSaulloCastro, например, YYYY/MM/DD, например: 2013/06/15, а затем сравнить лексикографию –

+0

Спасибо! Это то, что я пытаюсь. Отметьте ответ как принятый, как только я его заработаю. – GLEB

0

Я не помню много встроенных функций списка (что, вероятно, будет более эффективным). Есть несколько способов решить эту проблему, один такой:

Метод 1: Не так элегантно

  1. Построить структуру, которая держит каждую строку, которая приходит в (например, список). Поскольку вы будете искать по столбцу, вы можете создать список списков, в котором каждый элемент (доступ к которому соответствует строка, координата столбца) представляет слово (используя разделение запятой).
  2. Loop через первую колонку и по структуре (так, колонки «хэш»)
  3. Когда вы получаете спичку, шаг в следующей колонке (в данном случае, дата) и проверить на наличие дубликатов там
  4. Если один найден, проверьте строку даты и выберите дату с более новой датой.

* Alternative *

  1. Создание словаря с ключом является хэш и значение представляет собой список других слов [дата, адрес, имя].
  2. Оберните этот словарь своим, который при вставке новой пары ключ-значение проверяет член «дата», а если входящая дата более новая, замените старый. Иначе, проигнорируйте новую строку.

Это зависит от вашей предполагаемой структуры и производительности. Я не тестировал эти два, поэтому я не могу говорить о скорости. но поиск хэша в словаре может быть более быстрым. Стою быть исправлена, хотя

Edit: Сравнение дат Возьмите строку даты и разделить его разделителем («\», «-» и т.д.), а затем в течение двух сроков в вопросе, используйте простой цикл, чтобы проверить время ожидания, исходя из года в день. Пример: (псевдокод)

def newestDate(date1, date2): 
    result = date1; 
    date1array = date1.split("/"); 
    date2array = date2.split("/"); 
    for i in range(0,date1array.length): 
    if (int(date2array[i]) > int(date1array[i])): 
      result = date2; 
      break; 
    return result; 

Конечно, вы должны построить в некоторых проверках ошибок в этой функции, чтобы гарантировать, что ничего с ума происходит. Кроме того, преобразовать каждую строку сравниваемых в целое число

0

Compiling ответ на @John Zwinck и замечание @ Сашей Šijak) вы можете получить то, что вы хотите делать:

import csv 
from collections import OrderedDict 

hash_col = 0 
date_col = 1 

with open('test.txt') as f: 
    od = OrderedDict() 
    lines = [] 
    for line in csv.reader(f): 
     line[date_col] = '{0:02d}/{1:02d}/{2:04d}'.format(
          *map(int, line[date_col].split('/'))) 
     lines.append(line) 
    lines.sort(key = lambda x: x[date_col]) 
    for line in lines: 
     od[line[hash_col]] = line 
0

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

from collections import defaultdict 
Смежные вопросы