我有一个烧瓶终点功能,可以传递每个用户的评分,积分和负点字典,如下所示:
leaderDict = {
'users': {
'<user1>': {
'rating': 80.0,
'positive': 32,
'negative': 8
},
'<user2>': { ... }
},
'groups': { ... }
}
return render_template('leaderboard.html', **{"leaderDict": leaderDict})
我希望能够在Jinja中创建一个排行榜,即按递减顺序按rating
排序。如果可能的话,我想避免在烧瓶侧重新创建上面的数据结构,并在Jinja中进行所有解析。这样做的最佳方法是什么?
答案 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建议列表。