2009-11-18 41 views
0

我有類似這樣的一組數據:在2D蟒蛇陣列如何合併重複

# Start_Time End_Time  Call_Type Info 
1 13:14:37.236 13:14:53.700 Ping1  RTT(Avr):160ms 
2 13:14:58.955 13:15:29.984 Ping2  RTT(Avr):40ms 
3 13:19:12.754 13:19:14.757 Ping3_1 RTT(Avr):620ms 
3 13:19:12.754    Ping3_2 RTT(Avr):210ms 
4 13:14:58.955 13:15:29.984 Ping4  RTT(Avr):360ms 
5 13:19:12.754 13:19:14.757 Ping1  RTT(Avr):40ms 
6 13:19:59.862 13:20:01.522 Ping2  RTT(Avr):163ms 
... 

當我通過解析它,我需要合併的Ping3_1Ping3_2結果,把這些平均兩排,出口,作爲一個行,所以結果的最後會是這樣:

# Start_Time End_Time  Call_Type Info 
1 13:14:37.236 13:14:53.700 Ping1  RTT(Avr):160ms 
2 13:14:58.955 13:15:29.984 Ping2  RTT(Avr):40ms 
3 13:19:12.754 13:19:14.757 Ping3  RTT(Avr):415ms 
4 13:14:58.955 13:15:29.984 Ping4  RTT(Avr):360ms 
5 13:19:12.754 13:19:14.757 Ping1  RTT(Avr):40ms 
6 13:19:59.862 13:20:01.522 Ping2  RTT(Avr):163ms 
... 

目前,我串聯列0和1,使一個獨特的密鑰,找到重複出現,然後該幹嘛其餘的平行乒乓球的特殊治療。它根本不優雅。只是想知道有什麼更好的方法來做到這一點。謝謝!

+2

副本是否總是在相鄰的行上? – 2009-11-18 22:01:40

回答

0

假設副本是相鄰的,你可以使用像這樣的生成器。我想你已經有一些代碼來的平均坪

def average_pings(ping1, ping2): 
    pass 

def merge_pings(seq): 
    prev_key=prev_key=None 
    for item in seq: 
     key = item.split()[:2] 
     if key == prev_key: 
      yield average_pings(prev_item, item) 
     else: 
      yield item 
     prev_key=key 
     prev_item=item 
0

我不知道你的數據是如何構建的,因此我假設類型的字典鴨打字目的的列表。

我還假設你的數據集的真正主鍵是開始。

for i in range(len(dataset)-1): 
    #Detect duplicates, assuming they are sorted properly 
    if dataset[i]["Start"] == dataset[i+1]["Start"]: 
    #Merge 'em 
    dataset[i+1] = merge(dataset[i], dataset[i+1]) 

    #Deleting items from the array you are iterating over is a bad idea 
    dataset[i] = None 

dataset = [item for item in dataset if item != None] #so just delete them later 

...其中合併將是實際合併的函數。

不優雅,C-ish,但可能比你目前使用的更好。

他們沒有排序嗎?

dataset.sort((lambda x,y: return cmp(x["Start"],y["Start"]))) 

現在他們應該是。

+0

絕對不要使用cmp來排序。它比較慢。使用鍵:'dataset.sort(key = operator.itemgetter('Start'))' – nosklo 2009-11-19 01:33:28

+0

嗯,我想我不會有任何選擇Py3k。 – badp 2009-11-19 12:08:43

1

假設你的副本是相鄰的(因爲它們可以顯示在你的問題),itertools.groupby是確定哪些是重複的(從operator.itemgetter一點幫助提取的「鑰匙」確定身份的理想方式。假設你有一個具有屬性如.start.end對象(坪)的列表:

import itertools 
import operator 

def merge(listofpings): 
    k = operator.itemgetter('start', 'end') 
    for i, grp in itertools.groupby(listofpings, key=k): 
    lst = list(grp) 
    if len(lst) > 2: 
     item = mergepings(lst) 
    else: 
     item = lst[0] 
    emitping(i, item) 

假設已經具備的功能mergepings合併> 1「重複」坪的列表,並且emitping發出編號平(裸或合併)

如果listofpings尚未正確排序,只需在for循環之前添加listofpings.sort(key=k)(推測按照排序順序排列是OK,對嗎?)。