0

マーカー オブジェクトの 2 つのリストがあります。

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

ここには2つの問題があります:

  1. これを行うための最もpythonicな方法は何ですか
  2. 元のリストはおそらく 10k まで大きく、外部ファイルから作成されますが、新しいリストは 100 ~ 300 まで小さくなります。リストを使用するよりも効率的な方法はありますか?
4

1 に答える 1

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) アルゴリズムが発生します。

于 2012-08-16T14:29:11.637 に答える