gpt4 book ai didi

python - 如何对类实例列表进行排序

转载 作者:太空宇宙 更新时间:2023-11-03 18:58:22 25 4
gpt4 key购买 nike

我正在使用 GAE 和 memcache 进行操作。对于我的图书列表,我创建一个 key 并将其存储在内存缓存中,以避免每次我必须查看该列表时都命中数据库。

当我向数据库添加新项目时,我也会将其添加到内存缓存键,但是是列表的开头,如下所示(在本例中,自身是书籍实体):

class Book(ndb.Model):
""" A Book """
title = ndb.StringProperty(required=True)
author = ndb.StringProperty(required=True)

# Add a new element to memcache
def add_to_memcache(self):
data = memcache.get('mybooks')
if data:
logging.info('Adding to Memcache for key %s.', 'mybooks')
data.insert(0, self)
if not memcache.set('mybooks', data):
logging.error('Memcache set failed for key %s.', 'mybooks')

@classmethod
def get_all(cls):
key = 'mybooks'
books = memcache.get(key)
if books is None:
books = list(Book.query().order(Book.title).fetch(100))
if not memcache.set(key, books):
logging.error('Memcache set failed for key %s.', key)
else:
logging.info('Memcache hit for key %s.', key)
return books

@classmethod
def save(cls, **kwargs):
book = cls(title=kwargs['title'],
author=kwargs['author']
)
book.put()
# Modify memcache for this key
book.add_to_memcache()
return book

因此,在第一次读取 memcache 时,所有内容都是有序的,但是对于一本新书,列表不再是有序的。

我尝试制作:

data.insert(0, self)
data = sorted(data, key=itemgetter(1))

但是我收到错误TypeError:“Book”对象不支持索引

对索引有什么建议吗?

最佳答案

这里问题的最终解决方案可能对其他一些“堆栈器”有用。关键是线

data = sorted(data, key=lambda self: self.key_func())

它将从数据列表中获取每个项目(使用 lambda 函数)并调用 key_func 来评估对象类型以按正确的字段排序。感谢 @root 提供的这个解决方案。

class Book(ndb.Model):
""" A Book """
title = ndb.StringProperty(required=True)
author = ndb.StringProperty(required=True)

def key_func(obj):
if isinstance(obj, Book):
return obj.title
else:
raise TypeError('Unknown object!!!')

# Add a new element to memcache
def add_to_memcache(self):
data = memcache.get('mybooks')
if data:
logging.info('Adding to Memcache for key %s.', 'mybooks')
data.insert(0, self)
data = sorted(data, key=lambda self: self.key_func())
if not memcache.set('mybooks', data):
logging.error('Memcache set failed for key %s.', 'mybooks')

@classmethod
def get_all(cls):
key = 'mybooks'
books = memcache.get(key)
if books is None:
books = list(Book.query().order(Book.title).fetch(100))
if not memcache.set(key, books):
logging.error('Memcache set failed for key %s.', key)
else:
logging.info('Memcache hit for key %s.', key)
return books

@classmethod
def save(cls, **kwargs):
book = cls(title=kwargs['title'],
author=kwargs['author']
)
book.put()
# Modify memcache for this key
book.add_to_memcache()
return book

注意:add_to_memcache 函数旨在在多个类中共享,但我将其放在 Book 中仅供询问。

关于python - 如何对类实例列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16717024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com