2017-01-25 10 views
0

こんにちは私は、sを介して並べ替えたいデータオブジェクトを複雑にしています。以下の簡略化されたバージョン:特定の規則を使用してリストを並べ替える方法

class Data(object): 
    def __init__(self, s): 
     self.s = s 

これらのデータオブジェクトのそれぞれは、後で使いやすくするために特定のカテゴリに配置されます。もう一度簡略化されたバージョン

class DataCategory(object): 
    def __init__(self, id1, id2, linked_data=None): 
     self.id1 = id1 
     self.id2 = id2 
     self.ld = linked_data 

以下のデータを数字で並べ替える必要がありますが、それ以上のルールはありません。最初のデータ収集から1つのデータオブジェクトが使用された場合、2番目のコレクションから1つを使用したい場合、IFの数は同じかそれ以下です。ここで私が得るものであると私はこれは私がこれまでに作成したものですが、私は、私はこれで間違った方向に行くよということを考えてい

# order I get 
# [['p02g01r05', 5], ['p02g01r01', 4], ['p01g01r05', 4], ['p01g01r01', 3], ['p01g01r02', 2], ['p01g01r03', 2], ['p01g01r06', 2], ['p02g01r02', 2], ['p02g01r03', 2], ['p02g01r04', 2], ['p01g01r04', 1], ['p02g01r06', 1]] 
# order I want 
# [['p02g01r05', 5], ['p01g01r05', 4], ['p02g01r01', 4], ['p01g01r01', 3], ['p02g01r02', 2], ['p01g01r02', 2], ['p02g01r03', 2], ['p01g01r03', 2], ['p02g01r04', 2], ['p01g01r06', 2], ['p02g01r06', 1]], ['p01g01r04', 1] 

達成したいです。置き換えるインデックスのリストは正しいと思います。

# Some data objects 
p01g01r01 = Data(3) 
p01g01r02 = Data(2) 
p01g01r03 = Data(2) 
p01g01r04 = Data(1) 
p01g01r05 = Data(4) 
p01g01r06 = Data(2) 

p02g01r01 = Data(4) 
p02g01r02 = Data(2) 
p02g01r03 = Data(2) 
p02g01r04 = Data(2) 
p02g01r05 = Data(5) 
p02g01r06 = Data(1) 

p01g01 = DataCategory("01", "01", []) 
p02g01 = DataCategory("02", "01", []) 


# link data to data category 
def ldtdc(dc): 
    lst = [] 
    data = "p" + dc.id1 + "g" + dc.id2 + "r" 
    for i in range(1, 7): 
     if i < 10: 
      lst.append(data + "0" + str(i)) 
     else: 
      lst.append(data + str(i)) 
    return lst 

p01g01.ld = ldtdc(p01g01) 
p02g01.ld = ldtdc(p02g01) 


# /@= This starts to get way too complicated fast ############################ 
def lstu(ag, dg): 
    lst = [] 
    # data list of first collection 
    dlofc = [] 
    # data list of second collection 
    dlosc = [] 

    # for every data unit that exists in data collection 
    for unit in ag.ld: 
     # lst.append([unit, globals()[unit].s+10]) 
     lst.append([unit, globals()[unit].s]) 
     dlofc.append([unit, globals()[unit].s]) 

    for unit in dg.ld: 
     lst.append([unit, globals()[unit].s]) 
     dlosc.append([unit, globals()[unit].s]) 

    # lambda function is used here to sort list by data value ([1] is index of the item) 
    lst = sorted(lst, key=lambda x: x[1], reverse=True) 
    # current index 
    ci = 0 

    previous_data = ["last data unit will be stored here", 0] 
    # sorted list 
    slst = [] 

    for unit in lst: 
     try: 
      next_data = lst[ci+1] 
     except IndexError: 
      next_data = ["endoflist", 0] 
     if previous_data[0] == "last data unit will be stored here": 
      pass 
     elif previous_data[0][:6] == unit[0][:6]: 
      if unit[0][:6] not in dlofc[0][0]: 
       slst.append([unit[0], unit[1], ci]) 
      elif unit[0][:6] not in dlosc[0][0]: 
       slst.append([unit[0], unit[1], ci]) 
      else: 
       print "Error" 

     previous_data = unit 
     ci += 1 

    print "slist below" 
    print slst 

    return lst 
# \@= END ##################################################################### 


print p01g01.ld 
print p02g01.ld 


data_list = lstu(p01g01, p02g01) 
print data_list 

このデータをソートする迅速かつ正確な方法は何ですか?

+1

あなたは 'sorted'関数または' list.sort'メソッドを考えましたか? – skyking

+0

上記の例では、私はすでにソート済みを使用していることがわかりますが、新しいリストのすべての要件を満たすのに十分ではありません – Hsin

+0

ソート時に 'sorted'と' list.sort'という方法を制御できることをご存じですか? ?一度それを制御することができたら、 'sorted'や' list.sort'を使うことができないはずの理由が分かりません。 – skyking

答えて

0

検出された溶液。新LSTU機能:私は新しい(そして最後の)リストについては、前述の要件を満たす。このように

# replaced lambda with normal function 
def get_key(item): 
    return item[1] 


def lstu(ag, dg): 
    # ag list 
    agslst = [] 
    # dg list 
    dgslst = [] 

    # for every unit in first data collection 
    for unit in ag.u: 
     agslst.append([unit, globals()[unit].s]) 
    # sorted first data collection list 
    agslst = sorted(agslst, key=get_key, reverse=True) 
    print agslst 

    for unit in dg.u: 
     dgslst.append([unit, globals()[unit].s]) 
    # 2nd collection sorted list 
    dgslst = sorted(dgslst, key=get_key, reverse=True) 
    print dgslst 

    lst = [] 
    # last item 
    li = ["Empty", 0] 

    for item in range(0, len(agslst)+len(dgslst)+1): 
     if agslst and dgslst: 
      if agslst[0][1] == dgslst[0][1]: 
       if li[0][:6] == agslst[0][0][:6]: 
        li = dgslst.pop(0) 
        lst.append(li) 
       else: 
        li = agslst.pop(0) 
        lst.append(li) 

      elif agslst[0][1] > dgslst[0][1]: 
       li = agslst.pop(0) 
       lst.append(li) 
      else: 
       li = dgslst.pop(0) 
       lst.append(li) 

    return lst 

が出力:

[['p02g01r05', 5], ['p01g01r05', 4], ['p02g01r01', 4], ['p01g01r01', 3], ['p02g01r02', 2], ['p01g01r02', 2], ['p02g01r03', 2], ['p01g01r03', 2], ['p02g01r04', 2], ['p01g01r06', 2], ['p02g01r06', 1]], ['p01g01r04', 1]] 

が、私は任意の最適化の提案を開いています。

1

文字列で最初にソートしてからアイテムの番号順にソートしましたか?

>>> items = [['p02g01r05', 5], ['p02g01r01', 4], ['p01g01r05', 4], ['p01g01r01', 3], ['p01g01r02', 2], ['p01g01r03', 2], ['p01g01r06', 2], ['p02g01r02', 2], ['p02g01r03', 2], ['p02g01r04', 2], ['p01g01r04', 1], ['p02g01r06', 1]] 
>>> partially_sorted = sorted(items, key=lambda item: item[0], reverse=True) 
>>> sorted(partially_sorted, key=lambda item: item[1], reverse=True) 
[['p02g01r05', 5], ['p02g01r01', 4], ['p01g01r05', 4], ['p01g01r01', 3], ['p02g01r04', 2], ['p02g01r03', 2], ['p02g01r02', 2], ['p01g01r06', 2], ['p01g01r03', 2], ['p01g01r02', 2], ['p02g01r06', 1], ['p01g01r04', 1]] 
+0

これは動作しません。 p01g01の項目が1つ、p02g01の項目が同じ「s」の項目が1つあります。上記の例では、同じコレクションから同じ "s"を持つ多くのアイテムを取得します。 – Hsin

+0

基本的に2つのソートされたリストをマージしていますか? p01g01とp02g01というソートされたリスト? – aisbaa

+0

いいえ、python sortは安定していますhttps://en.wikipedia.org/wiki/Sorting_algorithm#Stability – aisbaa

関連する問題