我构建了一个这样的数据结构:
{ 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 ...]) ]
答案 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 %}