Python:根据特定条件对列表进行重新编制

时间:2013-12-05 14:33:02

标签: python list

我正在从外部来源收到可能包含重复值的数据Feed。

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 个答案:

答案 0 :(得分:4)

制作一个dict,键是你的“哈希”列,值是整行。对于每一行,看看它是否在dict中;如果没有,请插入它。如果存在,则在日期较晚时覆盖现有值。

如果您需要输入与输入类似,请使用OrderedDict而不是常规输出。

答案 1 :(得分:0)

我不记得很多内置列表功能(可能更有效)。有几种方法可以解决这个问题,其中之一就是:

方法1:不那么优雅

  1. 构建一个包含每一行的结构(例如,列表)。由于您将按列搜索,因此您可以构建一个列表列表,其中每个元素(由行,列坐标访问)表示一个单词(使用逗号分隔)。
  2. 循环遍历第一列和结构(所以,'hash'列)
  3. 当你得到一个匹配时,进入下一列(在这种情况下,日期)并检查是否有重复
  4. 如果找到一个,请检查日期字符串并选择具有较新日期的字符串。
  5. * 替代*

    1. 使用键作为哈希构建字典,值是其他单词[日期,地址,名称]的列表。
    2. 在您自己的字典中包装此字典,在插入新的键值对时,检查“日期”成员,如果传入的日期较新,请替换旧的字典。否则,请忽略新行。
    3. 这取决于您的预期结构和性能。我没有对上面两个进行任何测试,所以我不能说速度。但是字典上的哈希查找可能会更快。我有待纠正,但

      编辑: 比较日期 取日期字符串并用分隔符('\',' - '等)拆分,然后对于有问题的两个日期,使用一个简单的循环来检查新近度,从一年到一天。 示例:(伪代码)

      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;
      

      当然,您应该在此函数中构建一些错误检查,以确保不会发生任何疯狂事件。另外,将每个被比较的字符串转换为整数

答案 2 :(得分:0)

编译@John Zwinck的答案和@SašaŠ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

答案 3 :(得分:0)

defaultdict可能在这里有一些实用性。可以构造一个类似的类,如果它符合您定义的标准,它将接受一个值。

from collections import defaultdict