2016-11-22 285 views
0

我在python中使用日期。使用其他列表的重复项删除项目列表

d = [] 
t = [] 
for row in cursor: 
    emp = row[2] #employee ID 
    logtype = row[4] # 'I' For login, 'O' for logout. 
    log = row[3] # time 

    day = log.strftime("%d") 
    month = log.strftime("%m") 
    year = log.strftime("%y") 
    times = log.strftime("%I:%M") 

    if (logtype == 'I') : 
     d.append(day) 
     t.append(times) 


#the problem 
time = list(set(t)) #len(22) 
day = list(set(d)) #len(23) 

RESULT
Day = ['03', '04', '05', '06', '07', '09', '10', '11', '11', '12', '13', '14', '17', '18', '19', '20', '21', '23', '24', '25', '26', '27', '28'] 

Time = ['08:05', '08:01', '08:08', '10:33', '08:05', '06:53', '08:15', '08:03', '08:06', '08:11', '08:05', '08:03', '09:23', '08:10', '08:05', '08:10', '08:26', '01:43', '08:01', '08:10', '01:14', '08:06', '08:06'] 

欲同时其在时间值,以除去所述重复天(11)。

UPDATE

from collections import Counter   
#identify repeating day in dex number duplicate 
dup = [i for key in (key for key, count in Counter(day).items() if count > 1) for i, x in enumerate(day) if x == key] 

我设法找到重复使用上述代码然后我删除其他除重复最后一次出现,然后通过下面的代码

for x in dup[:-1]: 
    time.pop(x) 
    day.pop(x) 
    day2.append(adlaw) 
    time2.append(time) 
附加的指针
+1

请编辑您的问题并添加您尝试过的代码。它工作吗? – 2016-11-22 09:50:44

+2

我很困惑*“如何使用Day的重复值在Time中删除列表项”*但您的'Day'已经具有唯一值,对吗?还请提一下你想要的列表结构以及你试图达到的目标。 –

+3

因此你想删除'08:06',因为'Day'中有两个'11'? – Keiwan

回答

1

zip这两个列表都是按日期分组的,并且在该组中第一次出现日期,删除以下(重复),即如果要保留第一个项目。

使用itertools.groupby做在一个行:

[list(e[1])[0][1] for e in itertools.groupby(zip(Day,Time),lambda t:t[0])]) 

结果:

['08:05', '08:01', '08:08', '10:33', '08:05', '06:53', '08:15', '08:03', '08:11', '08:05', '08:03', '09:23', '08:10', '08:05', '08:10', '08:26', '01:43', '08:01', '08:10', '01:14', '08:06', '08:06'] 

,如果你想通过list(e[1])[-1][1]

0

如果保持最后项目,只需更换期限你正在尝试做@Keiwan建议的,然后考虑创建一个新列表,而不是删除不需要的值。从列表运行时复杂度中删除一个元素是O(n),而将一个项目附加到列表通常是O(1)。

正确的解决方案,因此,将是 -

  • 有一组“已经使用的天”,初始化为空

  • 具有新时代的列表,初始化为空

  • 运行在天

  • 每一天的清单,检查它是否会出现在“已使用“;如果是 - 跳过它。如果不是 - 将其添加到该集合中,并将适当的时间附加到“新时间”。