1

階層を説明するリストがあります。

[obj1, obj2, [child1, child2, [gchild1, gchild2]] onemoreobject]

ここで、child1(およびその他)はobj2の子であり、gchild1および2は子2の子です。

この各オブジェクトにはdate、たとえばのような属性があり、そのような属性に従って並べ替えたいと思います。通常のリストでは、私は次のようになります:

sorted(obj_list, key=attrgetter('date'))

この場合、それでもリストには属性がないため、そのメソッドは機能しませんdate...たとえ機能したとしても、その属性が親と異なる場合は、階層的な順序が崩れます。Pythonでこれを行うためのシンプルでエレガントな方法はありますか?

4

4 に答える 4

0

これは、Pythonが提供するポリモーフィズムを使用したQuickSortアルゴリズムの実装です。これは、int、float、list、ネストされたリスト、タプル、さらには辞書でも機能するはずです。

def qsort(list):
    if not list: return []
    first   = list[0]
    lesser  = filter( lambda x: x <  first, list[1:] )
    greater = filter( lambda x: x >= first, list[1:] )
    return qsort(lesser) + [first] + qsort(greater)
于 2013-02-21T12:31:50.510 に答える
0

鍵をsort(key = None)関数に入れるだけで、これは機能すると思います。文字列でテストしましたが、動作するようです。onemoreobjectの構造がわかりませんでした。これは、obj1とobj2で最初にソートされました。もう1つのオブジェクトが新しい階層を表す可能性があると考えたので、各階層をリストにまとめて、同じようなオブジェクトをまとめました。

def embededsort(alist):
  islist = False
  temp = []
  for index, obj in enumerate(alist):
    if isinstance(obj,list):
      islist = True
      embededsort(obj)
      temp.append((index,obj))
  if islist:
    for lists in reversed(temp):
      del alist[lists[0]]
    alist.sort(key=None)
    for lists in temp:
      alist.append(lists[1])
  else:
    alist.sort(key=None)
  return alist

>>>l=[['obj2', 'obj1', ['child2', 'child1', ['gchild2', 'gchild1']]], ['obj22', 'obj21', ['child22', 'child21', ['gchild22', 'gchild21']]]]  
>>>print(embededsort(l))
[['obj1', 'obj2', ['child1', 'child2', ['gchild1', 'gchild2']]], ['obj21', 'obj22', ['child21', 'child22', ['gchild21', 'gchild22']]]]
于 2013-02-21T09:29:50.587 に答える
0

彼らは私にかなりの数のアイデアと学ぶべき新しいことを与えてくれたので、答えてくれてありがとう. 動作するように見える最終的なコードは次のようになります。私が想像したほど短くてエレガントではありませんが、うまくいきます:

def sort_by_date(element_list):
    last_item = None
    sorted_list = []
    for item in element_list:
        #if item is a list recurse and store it right below last item (parent)
        if type(item) == list:
            if last_comparisson:
                if last_comparisson == 'greater':
                    sorted_list.append(sort_by_date(item))
                else:
                    sorted_list.insert(1, sort_by_date(item))
        #if not a list check if it is greater or smaller then last comparisson
        else:
            if last_item == None or item.date > last_item:
                last_comparisson = 'greater'
                sorted_list.append(item)
            else:
                last_comparisson = 'smaller'
                sorted_list.insert(0, item)
            last_item = item.date
    return(sorted_list)
于 2013-02-21T19:56:05.853 に答える
-1

兄弟ではないノードを考慮せずにノードのすべての子をソートする場合は、ツリー構造を使用します。

class Tree:
    def __init__ (self, payload):
        self.payload = payload
        self.__children = []

    def __iadd__ (self, child):
        self.__children.append (child)
        return self

    def sort (self, attr):
        self.__children = sorted (self.__children, key = lambda x: getattr (x.payload, attr) )
        for child in self.__children: child.sort (attr)

    def __repr__ (self):
        return '{}: {}'.format (self.payload, self.__children)
于 2013-02-21T03:49:13.087 に答える