OrderedDict的OrderedDict和在YAML问题中存储数据

2024-10-05 14:23:06 发布

您现在位置:Python中文网/ 问答频道 /正文

所以基本上我有一个应用程序,我正在做的有用户数据,我想备份和加载到数据库。我把数据存储在yml文件里。现在,用户有了帖子。每个帖子都有时间戳、文本和标签。我想使用ordereddictionary,以便在YAML文件中写入数据时保持顺序。目前,我正在做这样的事情:

def get_posts(user):
    posts_arr = []

    for post in user.posts.all():
        temparr = OrderedDict()

        temparr['timestamp'] = post.created_at.strftime("%Y-%m-%d %H:%M %p")
        temparr['text'] = post.text
        temparr['tags'] = (',').join(list(post.tags.all().values_list('field',flat=True)))

        posts_arr.append(temparr)

    return posts_arr

如您所见,我使用的是orderectionaries数组,我认为这就是我为每个用户发布的帖子没有被排序的原因。如何解决这个问题

我返回这个posts\u arr对象以存储在另一个ordereddictionary中

另外,由于posts文本是嵌套的,并且是一个大的文本块,所以我希望确保文本也存储在字符串文本块样式中


Tags: 文件数据text用户文本tagsallpost
2条回答

基本上,您的问题是对排序字典在python中如何工作的误解。python文档说明OrderedDict是:

dict subclass that remembers the order entries were added

https://docs.python.org/3/library/collections.html#module-collections

就我个人而言,我推荐一个由预先排序的帖子列表创建的字典列表。在本例中,如果我们保持您的大部分代码的原样,它会像这样:

def get_posts(user):
    posts_arr = []
    sorted_posts = sorted(user.posts.all(), key=(lambda post: post.created_at))  # Sorts the posts based on their created_at date
    for post in sorted_posts:
        temparr = dict()

        temparr['timestamp'] = post.created_at.strftime("%Y-%m-%d %H:%M %p")
        temparr['text'] = post.text
        temparr['tags'] = (',').join(list(post.tags.all().values_list('field',flat=True)))

        posts_arr.append(temparr)

    return posts_arr

您可以使用列表理解来从chepner建议的排序列表构建此列表,但我不想做太多更改

为每个帖子使用一个普通的dict(或者OrderedDict,如果您确实需要的话),并为所有帖子的集合使用一个列表。一旦这样做了,就可以使用列表理解直接定义返回值了

def get_posts(user):
    return [{
                'timestamp': post.created_at.strftime("%Y-%m-%d %H:%M %p"),
                'text': post.text,
                'tags': ','.join(list(post.tags.all().values_list('field', flat=True)))
            } for post in user.posts.all()]

相关问题 更多 >