python和django:如何使用键上的特定规则打印字典

时间:2012-07-24 19:36:09

标签: python django sorting dictionary

我构建了一个这样的数据结构:

{ level: [ event1, event2... ] }

level是以下之一:C(代表严重),H(代表高),M(代表中等),L(代表低)。

我想基于级别打印django模板中的所有事件,首先是C(临界),然后是H(高),M(中),L(低)。但是,默认情况下,这就是我所拥有的:

{% for level, events in dictionary.items %}
    {% for event in events %}
        do something with level, event
    {% endfor %}
{% endfor %}

我首先打印出H(高),然后打印出C(关键)等等。我想问:如何按特定顺序循环字典?或者我应该将其转换为其他数据结构?感谢。

修改 我认为史蒂夫的方法很好。它将字典转换为列表,字典的每个条目都成为元组:

[ (level1: [event1, event2 ...]), (level2: [event3, event4 ...]) ]

3 个答案:

答案 0 :(得分:1)

字典未订购,因此您需要先将它们转换为元组列表:

按如下方式对它们进行排序:

level_values = {'C':0, 'H':1, 'M':2, 'L':3}
sorted_dictionary = sorted(dictionary.items(), key=lambda x: level_values[x[0]])

然后传入您的sorted_dictionary变量,并以与以前相同的方式循环它:

{% for level, events in sorted_dictionary %}
    {% for event in events %}
        do something with level, event
    {% endfor %}
{% endfor %}

重要声明的进一步说明:

sorted_dictionary = sorted(dictionary.items(), key=lambda x: level_values[x[0]])

dictionary.items()为您提供元组列表,代表原始字典。所以不是像这样的字典:

{'A':[1,2,3], 'B',[4,5,6]}

如果给你一个元组列表,对于字典中的每个键/值对:

[('A', [1,2,3]), ('B', [4,5,6])]

您可以将元组视为无法更改的列表(它被称为“不可变”)。

然后将此元组列表传递给sorted函数。对于列表中的每个元组,sorted()调用我们提供的lambda表达式来请求排序键。我们的lambda表达式只接受元组中的第一个元素(即严重性值),并访问level_values字典以查找它的排序值。

你可以通过元组循环生成sorted_dictionary(这是一个元组列表):

for value in sorted_dictionary:
     print value[0]
     print str(value[1])

或Python将允许您自动将tuble拆分为单独的变量:

for severity, events in sorted_dictionary:
     print severity
     print str(events)

答案 1 :(得分:1)

您需要将其转换为其他数据结构。最简单的方法是,而不是字典,将已经排序的列表列表[low_levels, medium_levels, high_levels]或者您喜欢的列表传递到模板中,然后迭代这些列表。如果可以,您可以将其用作事件的表示。

答案 2 :(得分:1)

Python dict未订购。您需要将其转换为列表,然后对其进行排序。

converted = [
    ('C', mydict['C']),
    ('H', mydict['H']),
    ('M', mydict['M']),
    ('L', mydict['L']),
]

然后在模板中:

{% for level, events in converted %}
    {% for event in events %}
        do something with level, event
    {% endfor %}
{% endfor %}

或者,使用原始数据结构,只需遍历每个类别:

{% for event in dictionary.C %}
    do something with event, this is for Critical
{% endfor %}
{% for event in dictionary.H %}
    do something with event, this is for High
{% endfor %}
{% for event in dictionary.M %}
    do something with event, this is for Medium
{% endfor %}
{% for event in dictionary.L %}
    do something with event, this is for Low
{% endfor %}