【问题标题】:How to sort a dictionary in django?如何在 django 中对字典进行排序?
【发布时间】:2016-11-17 08:52:51
【问题描述】:

我是编程新手,在 django 中遇到了问题。

所以我试图根据值对字典进行排序。我尝试了这里看到的几种方法,但对我来说没有任何效果。它可以制作字典,但我不知道为什么它没有排序。

所以 'scoruri' 是字典:当在 html 中使用它时,它显示如下 {User: alex_py: 6, User: ion: 3, User: lil: 1, User: sss: 1, User: ddd: 1 , user: bbb: 7}, 'result' 是每个'user'(key)的得分。 当我打印 scoruri 的类型时,它会打印 6 次(输入“dict”)

scoruri 中的每个 key:value 可能实际上是一个字典,所以我有一个字典字典?

以下是我尝试排序的方法。

views.py

def home(request):
    data = dict()
    data['users'] = User.objects.all()
    data['scoruri'] = dict()

    if request.method == "POST":
        for key in request.POST:
            if 'nota_' in key:
                nota_acordata = Punctaj.objects.filter(acordat_de=request.user,
                                                       acordat_catre__id=key.split('_')[1]).first()
                if nota_acordata:
                    nota_acordata.nota = request.POST.get(key)
                    nota_acordata.save()

                else:
                    Punctaj.objects.create(acordat_de=request.user,
                                           acordat_catre_id=key.split('_')[1],
                                           nota=request.POST.get(key))  

                    messages.success(request, "Successfully Voted")
        return redirect('home')

    for user in data['users']:
        suma = Punctaj.objects.filter(acordat_catre=user).aggregate(punctaj=Sum('nota')).get("punctaj")
        count = Punctaj.objects.filter(acordat_catre=user).count()
        if not suma:
            result = 0
        else:
            result = int(suma)/count
        data['scoruri'][user] = result

        # sorted(data['scoruri'].items())
        # rezultate = sorted(data['scoruri'].items(), key=operator.itemgetter(1))
        print(type(data['scoruri']))
    return render(request, "login/home.html", data)

模板

{{ scoruri }}
<!--{{ rezultate }}-->

<!--{% for key, value in scoruri %}-->

       <!--{{ key }}:{{ value }}-->

<!--{% endfor %}-->

【问题讨论】:

  • 12 月的某个时候 Python 3.6 将会发布,它的字典总是默认排序的!
  • 嗨,我试过了:当我使用 {{ rezultate } } 在我的模板中,它不会显示任何内容。

标签: django python-3.x sorting dictionary django-views


【解决方案1】:

您应该使用保留插入顺序的OrderedDict 而不是dicthttps://docs.python.org/2/library/collections.html

from collections import OrderedDict

def home(request):
    data = dict()
    data['users'] = User.objects.all()
    data['scoruri'] = dict()

    if request.method == "POST":
        for key in request.POST:
            if 'nota_' in key:
                nota_acordata = Punctaj.objects.filter(acordat_de=request.user,
                                                       acordat_catre__id=key.split('_')[1]).first()
                if nota_acordata:
                    nota_acordata.nota = request.POST.get(key)
                    nota_acordata.save()

                else:
                    Punctaj.objects.create(acordat_de=request.user,
                                           acordat_catre_id=key.split('_')[1],
                                           nota=request.POST.get(key))  

                    messages.success(request, "Successfully Voted")
        return redirect('home')

    for user in data['users']:
        suma = Punctaj.objects.filter(acordat_catre=user).aggregate(punctaj=Sum('nota')).get("punctaj")
        count = Punctaj.objects.filter(acordat_catre=user).count()
        if not suma:
            result = 0
        else:
            result = int(suma)/count
        data['scoruri'][user] = result

        # sorted(data['scoruri'].items())
        # sorting and puting result into OrderedDict
        data['scoruri'] = OrderedDict(sorted(data['scoruri'].items(), key=operator.itemgetter(1)))
        print(type(data['scoruri']))

    return render(request, "login/home.html", data)

在模板中

{% for key, value in scoruri.items %}
    {{ key }}:{{ value }}
{% endfor %}

【讨论】:

  • 好吧,我真的不需要这个,我很生气,我只想按照每个用户的分数来排序字典,仅此而已。
  • 好的,所以现在如果我像你一样这样做,我会得到错误,因为 'int' 对象没有属性 'rate',之后我尝试不使用它: OrderedDict(sorted(data ['scoruri'].items(), key=lambda i: i[1])) 并且它起作用了,它对它们进行了排序,但输出正是这样: OrderedDict([(, 1), ( , 1), (, 1), (, 3), (, 6), (, 7)]) ,如果我从代码中得到 OrderedDict,它会给我这个:列表索引必须是整数,而不是用户,所以它正在对它们进行排序,但它也会在那里输出 OrderedDict
  • @NitaAlexandru 抱歉。固定应为data['scoruri'] = OrderedDict(sorted(data['scoruri'].items(), key=lambda i: i[1]))data['scoruri'] = OrderedDict(sorted(data['scoruri'].items(), key=operator.itemgetter(1)))
  • hm...无论我这样做,它都会显示如下:link
  • @NitaAlexandru 确实阅读了有关更新模板的部分。重读我的答案
【解决方案2】:

你不能对字典进行排序,你可以对字典的表示进行排序。字典有一个随机排序的成员。

您可以从 dict 成员中创建元组列表:

import operator
dict = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_dict = sorted(dict.items(), key=operator.itemgetter(1))

我希望这会有所帮助。

【讨论】:

  • 如果我这样做: sorted_dict = sorted(data['scoruri'].items(), key=operator.itemgetter(1)) 并在 html 中使用 {{ sorted_dict }},它是没有显示任何东西。
猜你喜欢
  • 2014-11-10
  • 2015-09-28
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 2014-05-26
相关资源
最近更新 更多