字典的顺序每次都有所不同

时间:2017-09-25 12:43:43

标签: python django dictionary

虽然使用OrderedDict,但每次都会改变字典的顺序。 我在views.py中写道

from collections import OrderedDict

from django.shortcuts import render
import json

def index(request):
    with open('./data/data.json', 'r') as f:
        json_dict = json.loads(f.read())
        json_data = OrderedDict()
        json_data = json_dict
    return render(request, 'index.html', {'json_data': json_data})

我在index.html中写道

<html>
 <head>
 <script type="text/javascript" src="//code.jquery.com/jquery-1.11.0.min.js"></script>
  <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/chosen/1.8.2/chosen.jquery.min.js"></script>
  <script src="//cdnjs.cloudflare.com/ajax/libs/chosen/1.4.2/chosen.jquery.js"></script>
 <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/chosen/1.4.2/chosen.css">
 </head>
 <body>
    <select id="mainDD" data-placeholder="Choose" class="chzn-select" style="width:600px;">
    {% for i in json_data.items.values %}
            <option>{{ i }}</option>
    {% endfor %}
    </select>
    <select name="type" id="type1">
    {% for j in json_data.type1.values %}
            <option>{{ j }}</option>
    {% endfor %}
    </select>
    <select name="type" id="type2">
    {% for k in json_data.type2.values %}
            <option>{{ k }}</option>
    {% endfor %}
    </select>
    <select name="type" id="type3">
    {% for l in json_data.type3.values %}
            <option>{{ l }}</option>
    {% endfor %}
    </select>
    <select name="type" id="type4">
    {% for m in json_data.type4.values %}
            <option>{{ m }}</option>
    {% endfor %}
    </select>

  </script>

  </body>
</html>

i&amp; j&amp; k&amp; l&amp; m的变量有json_data的结果,但是这个json_data字典不是顺序。例如i{'items': [{'---': '---', ‘A’: ‘a’, ‘B’: ‘b’, ‘C: ‘c’, ‘D’: ‘d’}]}但是向下钻取的顺序是b =&gt; c =&gt; d =&gt; a我想显示a =&gt; b =&gt; c =&gt; d。我认为这可以通过使用OrderedDict()来完成,但它是错误的。我该如何解决这个问题?我该怎么写呢?

2 个答案:

答案 0 :(得分:5)

您所做的就是使用OrderedDict对象覆盖已解析的JSON;这根本不起作用。

相反,作为the documentation shows,您可以将该类作为object_pairs_hook参数传递:

json_dict = json.loads(f.read(), object_pairs_hook=OrderedDict)

答案 1 :(得分:0)

你的想法是正确的。使用OrderedDict将保留字典中项目的顺序。但是,您的代码中存在错误:

json_data = OrderedDict()
json_data = json_dict

首先,您将json_data初始化为OrderedDict,但在第二个语句中,您覆盖变量并为其指定值json_dict

丹尼尔罗斯曼比我快,并给了你更好的答案,我只是天真地做到了这一点:

json_data = OrderedDict(json_dict)