flask / jinja:用无序的dict对象创建一个排行榜

时间:2013-07-28 18:13:20

标签: python dictionary flask jinja2

我有一个烧瓶终点功能,可以传递每个用户的评分,积分和负点字典,如下所示:

leaderDict = {
    'users': {
        '<user1>': {
            'rating': 80.0,
            'positive': 32,
            'negative': 8
        },
        '<user2>': { ... }
    },
    'groups': { ... }
}
return render_template('leaderboard.html', **{"leaderDict": leaderDict})

我希望能够在Jinja中创建一个排行榜,即按递减顺序按rating排序。如果可能的话,我想避免在烧瓶侧重新创建上面的数据结构,并在Jinja中进行所有解析。这样做的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

我建议您展平user: {stats...}字典,以便用户显示为更进一步的密钥。您可以使用列表解析来执行此操作:

[dict([('user', k)] + list(v.items())) for k, v in a['users'].items()]

这将为您提供一个类似于

的条目列表
{'user': '<user1>', 'negative': 8, 'positive': 32, 'rating': 80.0}

添加sorted以对其进行排序:

sorted([dict([('user', k)] + list(v.items())) for k, v in a['users'].items()], key=lambda x: x['rating'])

并使用for ... in迭代排序列表。要反向排序,请在reverse=True

中使用sorted

答案 1 :(得分:1)

Jinja2本身带有内置过滤器无法做到这一点。您必须在视图函数中对其进行排序或创建custom filter

另请注意,dict永远不会保证有序;请改为collections.OrderedDict。或者更好的是,将其设为mensi建议列表。