簡體   English   中英

通過嵌套列表排序

[英]Sorting through a nested list

我有一個描述層次結構的列表,例如:

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

其中,child1(和其他人)是obj2的孩子,而gchild1和2是孩子2的孩子。

每個對象都有諸如date屬性,例如,我想根據這些屬性對其進行排序。 在常規列表中,我會這樣:

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

在這種情況下,該方法仍然行不通,因為列表沒有date屬性。即使這樣做,即使其屬性與父屬性不同,層次結構的順序也會被破壞。 有沒有簡單而優雅的方法可以在python中做到這一點?

我認為您只需要將您的鍵放在sort(key = None)函數中即可。 我用字符串測試了它,它似乎可以工作。 我不確定一個對象的結構。 這以obj1和obj2開頭排序。 我以為一個對象可能代表一個新的層次結構,所以我將每個層次結構都封裝在一個列表中,以使類似的對象保持在一起。

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']]]]

這是使用Python提供的多態性的QuickSort算法的實現。 它應該適用於整數,浮點數,列表,嵌套列表,元組甚至字典

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)

感謝您的回答,因為他們給了我很多想法,以及可以學習的新知識。 看起來有效的最終代碼如下所示。 不像我想像的那樣淡淡而優雅,但是有效:

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)

如果要對節點的所有子節點排序而不考慮那些不是同級節點的節點,請使用樹結構:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM