1. 程式人生 > >python兩個列表合成字典順序問題

python兩個列表合成字典順序問題

今天師哥給指出了之前寫的模組的某處修改,其實我當時也是發現知道那塊問題是什麼的,結果當時為了急於pull就暫時忽略了那問題。以後得注意同樣的情況發生。

今天要修改的主要問題當時在解決前已明確指出:

1.推薦文章的第一個是圖片顯示
2.如何顯示2,3,4,5的hot標誌,也就是class標籤
3.滑鼠移動到title上會顯示文章全標題

1和3問題還是挺容易解決了。

{% if choice.order==1 %}
  <li class="{{ hot }}">
      <a href="{{ url_for('consult.consult_detail',id=choice
.choice_object.id) }}" title="{{ choice.choice_object.title }}"> <img src="{{ static('consult/images/pic180px.jpg') }}" > </a> </li> {% elif choice.order==2 or choice.order==3 %} ..........
第一個問題給html的模板裡面新增if判斷,因為推薦類的表中有order為int型別的屬性,如果推薦的是第一篇,order==1,顯示圖片不顯示標題。
<a 
href="{{ url_for('consult.consult_detail',id=choice.choice_object.id) }}" title="{{ choice.choice_object.title }}"> <div style="width:120px; white-space:nowrap;overflow:hidden;text-overflow:ellipsis"> {{ choice.choice_object.title }} </div> </a>
第三個滑鼠移動顯示文字在<a>裡面加上title,需要顯示的內容即可。加這個功能的原因是,有的標題如果太長不好,所以就需要設定下顯示固定長度的字數,上面的style中定義的屬性就實現了這個功能。是在網上找的。但這次能很快找出來並使用,一個原因是之前有個地方嘗試的用到,二是在實習專案日誌裡面之前也記錄了就很方便的找到。

至於第二個問題,體會到真的有時解決問題的關鍵就在於靈光一閃。

到目前為止,在flask裡面{%%}用的最多的就是for,if以及在href和src的{{}},哦還有顯示獲取資料的{{ XXXX }}。是真的腦子一轉。

<li class="hot1"><a href="#"><img src="" ></a></li>
<li class="hot2"><a href="#">內訓師技能提升</a></li>
<li class="hot3"><a href="#">內訓師技能提升</a></li>
<li class="hot4">4<a href="#">內訓師技能提升</a></li>
我是不是也可以把各種標籤裡面的屬性也用路由獲取的資料來表示呢。就類似於
<li class="{{ hot }}">

其實這種東西,越想越簡單,就越覺得可以,而且事實也是這樣的。

基於以上的突破點,目標就是把,舉例的hot1,hot2,hot3,hot4在路由裡面放在列表中,在模版裡面用for迭代的使用就可以。

這時遇到的問題就是,我本來已經在for迭代推薦文章,這個從資料庫XXXXDoc.objects.all()得到的資料是list。

如果再使用for就會引起html標籤大量重複顯示。所以,在經過一陣時間的思索搜查之後,字典得到了出場,而且一波兩折,問題最終解決。若之後還有bug再說。

hots=['hot1','hot2','hot3','hot4']
dictionary=dict(zip(hots,choices))

for hot,choice in dictionary.items():
    print '%s,%s' % (hot, choice)
首先了解到可以使用zip和dict的結合使用來將兩個列表的內容合成字典。本以為問題是解決了,開啟介面看時發現順序有點不對,這也是為什麼我加了print列印測試的原因。

發現的問題是,就hots列表裡面的四個值,我不論怎樣在[]裡面改變順序,結果在合成字典之後,在print出來的順序都是

hot4,XXXXXX

hot3,XXXXXX

hot2,XXXXXX

hot1,XXXXXX

直接導致顯示出來的效果一直不對。我修改了hot3->hot,然後,順序具體是什麼我忘了,但第一個打印出來的一直是

hot,XXXXXX

..........

所以合併之後順序就定好了一樣,人為的無法控制。晚上在網上看到這樣的解釋,希望能幫助你和我。

dict是一種散列表結構,就是說資料輸入後按特徵已經被散列了,有自己的順序.本身不記錄原輸入順序.
如果一定需要輸入順序,建議
方案1,不使用dict,使用元組的列表,比如[('sam',''),('beta',''),('ccc',''),('abc','')]
這種結構是記錄輸入順序的、有序的,也能方便地轉換成dict.
方案2,另用一列表記錄下輸入時的順序,比如['sam','beta','ccc','abc']

是找了半天我覺得很合適的解答。

在師哥的建議下就另找大致相同的思路,自己寫列表放入定義的字典中,然後看到說有專門解決次問題的函式——OrderedDict。

hots = ['hot1', 'hot2', 'hot3', 'hot4','hot5','hot6','hot7','hot8']
index=0
dictionary=collections.OrderedDict()
for choice in choices:
    dictionary[hots[index]]=choice
    index=index+1
if index==8:
        break
collection庫裡有這個OrderedDict真是極好的喲,反正我覺得就是能按列表裡面從頭開始的順序,加入字典。

最終,其實一開始的上面那塊程式碼都有,成功實現了標籤class屬性和內容的同步變化。