2016-11-22 169 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)。

正確的解決方案,因此,將是 -

  • 有一組「已經使用的天」,初始化爲空

  • 具有新時代的列表,初始化爲空

  • 運行在天

  • 每一天的清單,檢查它是否會出現在「已使用「;如果是 - 跳過它。如果不是 - 將其添加到該集合中,並將適當的時間附加到「新時間」。