2012-06-07 68 views
0

我列出比较列表 - 删除列表,其中ID = ID和日期>日期

[['Id', 'fname', 'lname', 'gender', 'startdate'], 
['100', 'John', 'Jackson', 'M', '08/09/2000'], 
['101', 'Jenny', 'Hobbs', 'F', '01/13/1995'], 
['100', 'John', 'Jackson', 'M', '08/09/1995']] 

的名单我想删除重复的名单,其中ID == ID和起始日期<起始日期。 使用具有最近startdate的唯一ID保留列表。

[['Id', 'fname', 'lname', 'gender', 'startdate'], 
['100', 'John', 'Jackson', 'M', '08/09/2000'], 
['101', 'Jenny', 'Hobbs', 'F', '01/13/1995']] 

任何帮助将通过ID日期顺序排序后,他们是伟大的

+2

这应该是类型的字典 – Daenyth

回答

4

东西行到字典中。你必须做的唯一事情就是在使用这个之前删除标题。

import time 

data = [['100', 'John', 'Jackson', 'M', '08/09/2000'], 
['101', 'Jenny', 'Hobbs', 'F', '01/13/1995'], 
['100', 'John', 'Jackson', 'M', '08/09/1995']] 

data = sorted(data, key=lambda x:time.strptime(x[4], '%m/%d/%Y')) # sort data in ascending date order 

keys = [x[0] for x in data] 
print keys 

d = dict(zip(keys,data))     # add to dictionary ... most recent values overwrite older ones 

print d.values() 

生成输出:

[['100', 'John', 'Jackson', 'M', '08/09/2000'], ['101', 'Jenny', 'Hobbs', 'F', '01/13/1995']] 
+0

的名单似乎是一个伟大的方式来删除重复,但问题有更多删除重复ID的标准。谢谢 – JonDog

+0

这也解决了数据需求以及...我错过了什么? –

+0

由于某些原因,日期格式错误'mm/dd/yyyy' – JonDog

0

这里是另一种解决方案。我只是把钥匙放进一套,因为我发现它们。 orig变量包含列表的原始列表,并且res是被删除重复的列表的列表。

mod_set = set() 
res = list() 
for x in orig: 
    if x[0] not in mod_set: 
      res.append(x) 
      mod_set.add(x[0]) 
0

这里是一个小脚本,做你想要什么:

import time 

mylist = [['100', 'John', 'Jackson', 'M', '08/09/2000'], 
['101', 'Jenny', 'Hobbs', 'F', '01/13/1995'], 
['100', 'John', 'Jackson', 'M', '08/09/1995']] 

dict = {} 
for sublist in mylist: 
    id,fname,lname,gender,startdate = sublist 
    if not id in dict: 
     dict[id] = [fname,lname,gender,startdate] 
    else: 
     olddate = dict[id][3] 
     if time.strptime(startdate,'%d/%m/%Y') > time.strptime(olddate,'%d/%m/%Y'): 
     dict[id] = [fname,lname,gender,startdate] 

print dict 

Output: {'100': ['John', 'Jackson', 'M', '08/09/2000'], '101': ['Jenny', 'Hobbs', 'F', '01/13/1995']} 

在结束dict会包含指向最近的记录唯一的ID。

1

到@Maria Zverina的相似,但有点更有条理:

import time 

data = [ 
    ['100', 'John', 'Jackson', 'M', '08/09/2000'], 
    ['101', 'Jenny', 'Hobbs', 'F', '01/13/1995'], 
    ['100', 'John', 'Jackson', 'M', '08/09/1995'] 
] 

# sort by date, ascending 
data.sort(key=lambda d: time.strptime(d[4], "%m/%d/%Y")) 

# load into a dict, key on ID, later data overwrites earlier 
latest = dict((d[0], d) for d in data) 

# return to list, sorted by ID 
data = sorted(latest.itervalues(), key=lambda d: int(d[0])) 

回报

# most recent data for each ID, sorted by ID: 
[ 
    ['100', 'John', 'Jackson', 'M', '08/09/2000'], 
    ['101', 'Jenny', 'Hobbs', 'F', '01/13/1995'] 
] 
+0

+1加载字典的好方法:) –