使用其他列表

时间:2016-11-22 09:48:50

标签: python

我在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)及其时间值。

更新

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)

2 个答案:

答案 0 :(得分: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]替换为

答案 1 :(得分:0)

如果您正在尝试执行@Keiwan建议的操作,请考虑创建新列表,而不是删除不需要的值。从列表运行时复杂性中删除元素是O(n),而将项目附加到列表通常是O(1)。

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

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

  • 列出新的时间,初始化为空

  • 在日期列表中运行

  • 每天
  • ,检查它是否出现在"已经使用过的&#34 ;;如果是 - 跳过它。如果不是 - 将其添加到该集合中,并将适当的时间附加到"新时间"。