2014-02-10 21 views
0

從元組列表中獲取重複計數數據項目1其中包含患者計數器data ... 。隨着樓下的樣品我不需要考慮data[0]data[2]從元組列表python(按其索引)報告重複

import itertools 
def getDuplicateinTuple(dataInput): 
    seen={} 
    return [seen.setdefault(t[0], t) for t in dataInput if t[0] not in seen] 

data=[('2013 Jul 5 06:56:07:', 'PATIENT:COUNTER1'), 
('2013 Jul 5 06:56:07:', 'PATIENT:COUNTER2'), 
('2013 Jul 5 06:56:07:', 'PATIENT:COUNTER3'), 
('2013 Jul 5 06:56:07:', 'PATIENT:COUNTER4'), 
('2013 Jul 5 06:57:11:', 'PATIENT:COUNTER1'), 
('2013 Jul 5 06:56:11:', 'PATIENT:COUNTER5')] 

data1=[('2013 Jul 5 04:26:40:', 'PATIENT:COUNTER1', 'COUNTER INFO: : 500 '), 
('2013 Jul 5 04:26:40:', 'PATIENT:COUNTER2', 'COUNTER INFO: : 500 '), 
('2013 Jul 5 04:26:40:', 'PATIENT:COUNTER3', 'COUNTER INFO: : 100 '), 
('2013 Jul 5 04:26:40:', 'PATIENT:COUNTER4', 'COUNTER INFO: : 100 ')] 

s=getDuplicateinTuple(data) 
print s 
s1=getDuplicateinTuple(data1) 
print s1 

與預期輸出重複的是:

[('2013 Jul 5 06:56:07:', 'PATIENT:COUNTER1'), ('2013 Jul 5 06:57:11:', 'PATIENT:COUNTER1')] 

和實際產量

[('2013 Jul 5 06:56:07:', 'PATIENT:COUNTER1'), ('2013 Jul 5 06:57:11:', 'PATIENT:COUNTER1'), ('2013 Jul 5 06:56:11:', 'PATIENT:COUNTER5')] 

上相同的,如果我給出非重複輸出,如data1

預期輸出:

[] 

但輸出電流:

[('2013 Jul 5 04:26:40:', 'PATIENT:COUNTER1', 'COUNTER INFO: : 500 ')] 

只是通過比較可以做到這一點的名單。 什麼是更好的和建議的方式來實現這一目標?

我看到了一些不錯的疊後在此方面: Find and list duplicates in a list?

+0

@falsetru:with ref http://ideone.com/DWv7uq data1 print getDuplicateinTuple(data)out ('2013年7月5日06:56:07:','患者:COUNTER1'),('2013年7月5日06:57:11:','患者:COUNTER1')]和 print getDuplicateinTuple(data1 )如預期匹配 – Ragav

回答

2

使用collections.defaultdict

from collections import defaultdict 

def getDuplicateinTuple(dataInput): 
    d = defaultdict(list) 
    for t in dataInput: 
     item1 = t[1] 
     d[item1].append(t) 
    return [t for ts in d.itervalues() if len(ts) > 1 for t in ts] 

data = [ 
    ('2013 Jul 5 06:56:07:', 'PATIENT:COUNTER1'), 
    ('2013 Jul 5 06:56:07:', 'PATIENT:COUNTER2'), 
    ('2013 Jul 5 06:56:07:', 'PATIENT:COUNTER3'), 
    ('2013 Jul 5 06:56:07:', 'PATIENT:COUNTER4'), 
    ('2013 Jul 5 06:57:11:', 'PATIENT:COUNTER1'), 
    ('2013 Jul 5 06:56:11:', 'PATIENT:COUNTER5') 
] 

data1 = [ 
    ('2013 Jul 5 04:26:40:', 'PATIENT:COUNTER1', 'COUNTER INFO: : 500 '), 
    ('2013 Jul 5 04:26:40:', 'PATIENT:COUNTER2', 'COUNTER INFO: : 500 '), 
    ('2013 Jul 5 04:26:40:', 'PATIENT:COUNTER3', 'COUNTER INFO: : 100 '), 
    ('2013 Jul 5 04:26:40:', 'PATIENT:COUNTER4', 'COUNTER INFO: : 100 ') 
] 

print getDuplicateinTuple(data) 
# => [('2013 Jul 5 06:56:07:', 'PATIENT:COUNTER1'), 
#  ('2013 Jul 5 06:57:11:', 'PATIENT:COUNTER1')] 
print getDuplicateinTuple(data1) 
# => [] 
+0

如果我必須省略時間戳意味着考慮數據[1]不是數據[0] – Ragav

+0

數據字段包含2項數據[0]是某個時間戳,數據[1]是內容。如果我只想提取內容(數據[1])重複的方法是什麼。 – Ragav

+0

在元組列表數據中,如果數據[1]已被複制,我想提取並顯示數據。 – Ragav

0

您可以創建一個(默認)字典來算的出現,然後過濾掉它們的出現小於一個:

from collections import defaultdict 
d = defaultdict(list) 
for timestamp, counter in data: 
    d[counter].append(timestamp) 

for counter, timestamps in d.items(): 
    if len(timestamps) > 1: 
     print([(t, counter) for t in timestamps]) 
+0

如果我必須省略時間戳意味着考慮數據[1]而不是數據[0] – Ragav

+0

忽略輸出中的時間戳?將最後一行改爲'print(counter)'。 – arocks