2012-07-24 29 views
0

特定規則的字典我建立了一個數據結構是這樣的:Python和Django的:如何打印與鍵

{ 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

剛擡起頭,排序和詞典通常不一起過得很好。 – underbar 2012-07-24 19:39:45

回答

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會讓你自動分割史話成獨立的變量:

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

感謝您的答覆,我不是一個Python的專家,我試過你的方法,它給TypeError:()只需要1個參數(2給出)? – 2012-07-24 19:53:17

+0

對不起,我做了一些編輯 - 你是否嘗試過最近的?請注意'key ='關鍵字。 @da_zhuang – 2012-07-24 19:54:09

+0

這是有效的!據我所知,我想它會將字典轉換爲列表?我該如何循環? – 2012-07-24 20:02:52

1

您需要將其轉換爲其他數據結構。最簡單的方法是,不是字典,而是將您已經排序的列表清單[low_levels, medium_levels, high_levels]或您想要的列表傳遞到您的模板中,然後遍歷這些列表。如果可以的話,你可能只是用它來表示你的事件。

1

Python dict s沒有排序。您需要將其轉換爲列表並對其進行分類。

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 %} 
+0

我認爲你的第一個建議更有意義,你的第二個建議我已經嘗試過了,但是給出了太多的代碼:) – 2012-07-24 19:47:27

+0

@da_zhuang親自我更喜歡第二種選擇。發生什麼事情更爲明顯。 – 2012-07-24 19:48:37