[英]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.