2012-08-16 20 views
0

列表對象的屬性我有標記對象的兩個列表對象的兩個列表:交纏基於Python中

class Marker(): 
    def __init__(self,marker_number, marker_data): 
     self.marker_number = marker_number 
     self.marker_data = marker_data 

,我想做的事情是這樣的:

>>> existing_markers = [Marker(marker_number=1, marker_data= 'a'), 
        Marker(marker_number=2, marker_data= 'b'), 
        Marker(marker_number=3, marker_data= 'c'), 
        Marker(marker_number=4, marker_data= 'd'), 
        Marker(marker_number=5, marker_data= 'e'),] 

>>> new_markers = [ Marker(marker_number=1, marker_data= 'aa'), 
        Marker(marker_number=3, marker_data= 'bb'), 
        Marker(marker_number=5, marker_data= 'cc'),] 

>>> interlace_markers(existing_markers, new_markers) 

[Marker(marker_number=1, marker_data= 'a'), 
Marker(marker_number=2, marker_data= 'aa'), 
Marker(marker_number=3, marker_data= 'b'), 
Marker(marker_number=4, marker_data= 'c'), 
Marker(marker_number=5, marker_data= 'bb'), 
Marker(marker_number=6, marker_data= 'd'), 
Marker(marker_number=7, marker_data= 'e'), 
Marker(marker_number=8, marker_data= 'cc')] 

使當我交錯標記時,new_markers列表中與原始標記列表具有相同編號的標記會出現在原始標記之後,但編號更新會保留編號的序列。這是我目前的做法:

def interlace_markers(current_markers_list, new_markers_list): 

    interlaced_markers = [] 
    #interlace the markers 
    for existing_marker in current_markers_list: 
     interlaced_markers.append(existing_marker) 
     for new_marker in new_markers_list: 
      if new_marker.marker_number== existing_marker.marker_number: 
       interlaced_markers.append(new_marker) 

    #reset the sequence 
    sequence_index = 1 
    for marker in interlaced_markers: 
     marker.marker_number= sequence_index 
     sequence_index += 1 

    return interlaced_markers 

我這裏有兩個問題:

  1. 什麼是做到這一點
  2. 原始列表將可能是大〜10K最Python的方式,並從創建一個 外部文件,但新的列表將會很短〜100-300長,是 有一個更有效的方式來做到這一點,而不是使用列表?

回答

1

如果我理解你正確,我認爲這是最容易簡單的排序完成:

interlace_markers = existing_markers + new_markers 
interlace_markers.sort(key = lambda x: x.marker_number) 

現在,如果要更改的編號,你可以做一個簡單的循環:

for i,marker in enumerate(interlace_markers): 
    marker.marker_number = i+1 #indexing is 1 based instead of zero based 

請注意,這是有效的,因爲python的排序是穩定這意味着如果不是必須的順序沒有改變。

這導致O(n)+ O(nlogn)= O(nlogn)算法不是太差。

+0

穩定排序的好主意。但是,這不會重新編號'marker_number'。 – eumiro 2012-08-16 14:31:40

+0

@eumiro - 固定。我錯過了這部分問題。謝謝。 – mgilson 2012-08-16 14:33:45

+0

@mgilson當這兩個標記號碼相同時,它是否會在現有標記之後重複排列新標記? – Ctrlspc 2012-08-16 14:34:23