2016-02-03 42 views
0

說我有一個先前排序的列表:ABCDEF。用戶可以過濾掉其中的一些項目,最終得到一個子集:BCEF。在子集中,用戶然後被允許重新排序這些項目。例如,他們將B移動到E之後,現在子集是:CEBF。然後他們關閉過濾器。我想要原始列表反映重新排序的子集。因此,完整列表現在應該如下所示:ACDEBF排序全套基於排序的子集

我在這裏尋找什麼排序技術?其他可能的相關信息:

  1. 在子階段,用戶只能一次移動一個項目
  2. 過濾器可以創建一個子集,它是任何數量的項目;它可能是完整的列表,它可能只是兩個項目(技術上它可能會降到0,但由於用戶無法對子集進行重新排序,所以1個案例變得微不足道)。
  3. 不在子集中的原始列表應儘可能保留它們的位置。

回答

0

這裏有一個解決方案:在

sorted_fullset = ["a","b","c","d","e","f"] 
sorted_subset = ["a","b","e"] 

def shuffle_set_by_subset(sorted_fullset,sorted_subset,shuffled_subset): 
    shuffle = dict((item,idx) for idx,item in enumerate(sorted_subset)) 
    shuffled_fullset = sorted_fullset[:] 
    for idx,item in enumerate(sorted_fullset): 
    if item in sorted_subset: 
     place_in_sorted_subset = shuffle[item] 
     shuffled_fullset[idx] = shuffled_subset[place_in_sorted_subset] 
    return shuffled_fullset 

print shuffle_set_by_subset(sorted_fullset,sorted_subset,["e","b","a"]) 
print shuffle_set_by_subset(sorted_fullset,sorted_subset,["a","e","b"]) 

結果:

['e', 'b', 'c', 'd', 'a', 'f'] 
['a', 'e', 'c', 'd', 'b', 'f'] 
0

由於預排序列表,只要創建一個子集,記的位置的子集中的項目與原始集合相關。 (例如,使用另一個陣列來跟蹤位置)。

然後確保在項目重新排列時,索引保持不變(如果使用單獨的數組,則默認爲這樣)。

最後將重新排列的項目複製回索引數組所指示的位置。例如:A = {a,b,c,d,e,f}。 B_ITEMS = {b,d,e}。 B_POSITIONS = {2,4,5}

比方說在乙項重新排列如下: B_ITEMS = {d,E,B}

複製在B_ITEMS項由B_POSITIONS所示的位置。

A = {a,d,c,e,b,f}

+0

謝謝。我有效地做到了這一點,但沒有明確使用額外的數組。我有原始數組A = {a,b,c,d,e,f},原始子集B = {b,d,e}。子集獲得C = {d,e,b}。然後我設置了兩個指針,一個指向原始數組pA,另一個指向子集pC。然後我開始按照以下規則遞增A設置項目:如果項目pA指向不在C中,則保留原位並提前pA。如果pA項目在C中,則插入pC指向的項目並增加pA和pC。 – seanm

+0

不能完全讓你滿意,但很高興你把它整理出來。指針可能會很棘手。也做測試重複的信件! –