我正在从外部来源收到可能包含重复值的数据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
我不能简单地使用构建列表函数(除非我完全错过了一个)所以我试图想到另一种方式。也许以某种方式遍历列表并比较值?
任何帮助都会非常感激。
感谢。
答案 0 :(得分:4)
制作一个dict,键是你的“哈希”列,值是整行。对于每一行,看看它是否在dict中;如果没有,请插入它。如果存在,则在日期较晚时覆盖现有值。
如果您需要输入与输入类似,请使用OrderedDict而不是常规输出。
答案 1 :(得分:0)
我不记得很多内置列表功能(可能更有效)。有几种方法可以解决这个问题,其中之一就是:
方法1:不那么优雅
* 替代*
这取决于您的预期结构和性能。我没有对上面两个进行任何测试,所以我不能说速度。但是字典上的哈希查找可能会更快。我有待纠正,但
编辑: 比较日期 取日期字符串并用分隔符('\',' - '等)拆分,然后对于有问题的两个日期,使用一个简单的循环来检查新近度,从一年到一天。 示例:(伪代码)
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