【问题标题】:OrderedDict of OrderedDict and storing data in YAML IssuesOrderedDict 的 OrderedDict 和在 YAML 问题中存储数据
【发布时间】:2019-03-12 16:22:13
【问题描述】:

所以基本上我有一个我正在制作的应用程序,其中包含我想要备份并加载到数据库中的用户数据。我将数据存储在 yml 文件中。现在,用户有帖子。每个帖子都有一个时间戳、文本和标签。当我在 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_arr 对象以存储在另一个有序字典中。

另外,由于帖子文本有点嵌套并且是一大块文本,我想确保文本也以字符串文字块样式存储。

【问题讨论】:

  • 您不需要OrderedDict 来处理其中任何一个。 temparr 可以是普通的dict,因为您不(或不应该)关心timestamptexttags 字段的相对顺序,而posts_arr 应该只是一个列表.
  • 不幸的是,我确实需要维护订单以确保易于阅读。如果我不这样做,那么我所有的帖子都会有不规则的时间戳、文本和标签顺序
  • 如果您使用的是 Python 3.7,插入顺序也将保留在常规 dict 中。
  • 嗯,我目前使用的是 python 3.5
  • 究竟是什么没有被订购?你能提供一份你的 YAML 文件,以及它应该出来的内容吗? user.posts.all() 是否按照您想要的顺序进行迭代?

标签: python python-3.x yaml pyyaml


【解决方案1】:

基本上,您的问题是对有序字典在 python 中的工作方式存在误解。 python 文档指出 OrderedDict 是:

添加了记住订单条目的dict子类

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 建议的那样使用列表推导从排序的列表中构建此列表,但我不想更改太多。

【讨论】:

    【解决方案2】:

    为每个帖子使用普通的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()]
    

    【讨论】:

      猜你喜欢
      • 2019-05-21
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 2016-02-03
      • 2019-06-28
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多