如何按属性有效地对 python 中的 objects 列表进行排序

How to efficiently sort a list of objects in python by attribute

可能有一个标题相似的问题,但没有帮助。

我正在编写字典(英语、德语),我现在的目标是按字母顺序对缓存(所有 vocab-objects 的列表)进行排序。
class vocab 的每个属性都是一个列表,列表中的第一个 element/word 是最重要的,因此也是您用来排序的词。

这是一个工作的最小版本:

class vocab:

    def __init__(self, english, german, context, box=0):
        """ self.eng/ger/con supposed to be lists"""
        self.eng = english
        self.ger = german
        self.con = context

    def present(self):
        return "English: {}\n\nGerman: {}\n\nExample: {}\n{}\n".format(self.eng,self.ger,self.con,"-"*20)
    #...


class dictionary:

    def __init__(self, Cache=[]):
        self.cache = Cache

    def sort_cache(self, sortby="eng"):
        """sort cache alphabetically (default = english)"""
        #list with sorted items
        #  -->item: (word used to sort, related vocObject)
        sort_cache = sorted([(getattr(voc,sortby),voc) for voc in self.cache])

        self.cache = [item[1] for item in sort_cache]

    def show_cache(self):
        """ print all vocabs from self.cache"""
        out = ""
        for voc in self.cache:
            out += voc.present()
        return out
    #...

#e.g.
voc1 = vocab(["to run"],["rennen","laufen"],["Run Forest! Run!!"])
voc2 = vocab(["to hide"],["(sich) verstecken","(etw.) verbergen"],["R u hidin sth bro?"])
voc3 = vocab(["anything"],["irgendwas"],["Anything ding ding"])
voc4 = vocab(["example","instance","sample"],["Beispiel"],["sample"])

MAIN_DIC = dictionary([voc1,voc2,voc3,voc4])

print MAIN_DIC.show_cache() #-->prints vocabs in order: to run, to hide, anything, example
                            #                           (voc1), (voc2) ,  (voc3) , (voc4)
MAIN_DIC.sort_cache()

print MAIN_DIC.show_cache() #-->prints vocabs in wanted order: anything, example, to hide, to run
                            #                                   (voc3) , (voc4) , (voc2) , (voc1)

因为我在我的 sort_cache 方法中创建了一个全新的缓存,所以我想知道更有效的方法会是什么样子。我确定有一个。

例如。我认为只对 self.cache 中的元素进行排序而不创建任何副本等会更有效率(节省时间)。

这是 "decorate-sort-undecorate" 模式:

    sort_cache = sorted([(getattr(voc,sortby),voc) for voc in self.cache])
    self.cache = [item[1] for item in sort_cache]

多年来,它一直是 Python 中首选的排序方法。它已被 sortsorted 函数中的内置支持所取代:

self.cache = sorted(self.cache, key=lambda item: getattr(item, sortby))

self.cache.sort(key=lambda item: getattr(item, sortby))

您可能还需要考虑按排序顺序维护 self.cache(通过首先将内容插入正确的位置 - 请参阅 bisect 模块以获得帮助),从而分摊排序成本您的插入(总体上可能更昂贵,但在任何单个操作上都更便宜)。

另请注意:

def __init__(self, Cache=[]):

为您提供一个 single shared 缓存列表,跨越所有使用此默认设置的 dictionary 实例。 Python.

中的可变默认值通常不是您想要的