0

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

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

level是以下之一:C(代表临界)、H(代表高)、M(代表中)、L(代表低)。

我想根据级别在 django 模板中打印所有事件,首先是 C(critical),然后是 H(high)、M(medium)、L(low)。但是,默认情况下,这就是我所拥有的:

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

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

编辑: 我认为史蒂夫的方法效果很好。它将字典转换为列表,字典的每个条目变成一个元组:

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

3 回答 3

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]}

if 为字典中的每个键/值对提供元组列表:

[('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)
于 2012-07-24T19:39:06.217 回答
1

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

于 2012-07-24T19:42:30.303 回答
1

Pythondict没有顺序。您需要将其转换为列表,然后对其进行排序。

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 %}
于 2012-07-24T19:42:35.877 回答