0

次のようなデータ構造を構築しました。

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

ディクショナリ内のキーと値のペアごとに、タプルのリストが表示される場合:

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

タプルは、変更できないリストと考えることができます (「不変」と呼ばれます)。

次に、このタプルのリストが関数に渡されsortedます。リスト内のタプルごとに、指定しsorted()たラムダ式を呼び出してソート キーを要求します。このラムダ式は、単純にタプルの最初の要素 (重大度の値) を取得し、level_values辞書にアクセスしてその並べ替え値を見つけます。

sorted_dictionary結果(タプルのリスト) をタプルごとにループできます。

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

または Python では、チューブを個別の変数に自動的に分割できます。

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 に答える