如何按属性有效地对 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 中首选的排序方法。它已被 sort
和 sorted
函数中的内置支持所取代:
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.
中的可变默认值通常不是您想要的
可能有一个标题相似的问题,但没有帮助。
我正在编写字典(英语、德语),我现在的目标是按字母顺序对缓存(所有 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 中首选的排序方法。它已被 sort
和 sorted
函数中的内置支持所取代:
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.