2017-02-12 50 views
0

使用我有2所列出:創建字典從2所列出,在Django模板

year_month_day_list = ['2017-02-12', '2017-02-11', '2017-02-10', '2017-02-09'] 

filename_prefix_list = ['2017-02-12_11-45-59', '2017-02-12_11-35-05', '2017-02-10_11-00-52', '2017-02-11_10-59-23', '2017-02-09_09-12-09'] 

如果我能抓住所有符合其相關的年月日的文件名:

def filter_files(file_list, filter_param): 
    return [f for f in file_list 
      if f.startswith(filter_param)] 

for unique_day in year_month_day_list: 
     files_for_day = sorted(filter_files(
      filename_prefix_list, unique_day), reverse=True) 

如何創建一個使用unique_day作爲鍵和當天相關文件名作爲值的字典?

輸出應該是這樣的:

dict = {'2017-02-12': ['2017-02-12_11-45-59', '2017-02-12_11-35-05'], '2017-02-10': ['2017-02-10_11-00-52']} 

那麼,我該如何使用那些在我的模板?例如:

<div class="thumbnail-row" id="thumbnail_row"> 
    <div class="row-date"> 
     <span>{{ unique_day }}</span> 
    </div> 
    <div class=""> 
     <form action="{{ filename_prefix }}/video/" method="post"> 
      {% csrf_token %} 
      <input type="image" name="filename_prefix" value="{{ filename_prefix }}" src="{{ MEDIA_URL}}thumbnails/2017/02/{{ filename_prefix }}.jpg"> 
     </form> 
    </div> 
</div> 

回答

2

您可以使用itertools.groupby按列表項目的日期進行分組。日期可以從datetime字符串中分割出來,並用作分組的鍵。您可以刪除sorted如果日期時間串已由日期集羣:

from itertools import groupby 
from pprint import pprint 

filename_prefix_list = ['2017-02-12_11-45-59', '2017-02-12_11-35-05', '2017-02-10_11-00-52', '2017-02-11_10-59-23', '2017-02-09_09-12-09'] 

dct = {k: list(g) for k, g in groupby(sorted(filename_prefix_list), lambda x: x[:10])} 
pprint(dct) 
# {'2017-02-09': ['2017-02-09_09-12-09'], 
# '2017-02-10': ['2017-02-10_11-00-52'], 
# '2017-02-11': ['2017-02-11_10-59-23'], 
# '2017-02-12': ['2017-02-12_11-35-05', '2017-02-12_11-45-59']} 

要使用模板字典簡單地將它傳遞給通過您的視圖功能在當前背景下,並得到其鍵值對使用{% for k, v in dct.items %}調用其items方法。

更一般地:

{% for k, v in dct.items %} 
    {% for dt in v %} 
    <!- your html --> 
    {% endfor %} 
{% endfor %} 
+0

看起來這個工作很棒。但是,我希望結果以鍵值和值列表的降序返回。基本上我想要最近的一天,然後是最新文件的文件。你能建議我如何做到這一點? dct上的Sort()將刪除這些值。 – brewcrazy

+0

將'reverse = True'傳遞給'sorted'並將結果保存到'collections.OrderedDict' –

+0

我將哪個結果保存到'collections.OrderedDict'?這是我現在的:'dct = {k:list(g)for k,g in groupby( sorted(sorted_filename_list,reverse = True),lambda x:x [:10])}' – brewcrazy

0

用於轉換列表成所需的格式dict,可以使用collections.defaultdict爲:

from collections import defaultdict 

year_month_day_list = ['2017-02-12', '2017-02-11', '2017-02-10', '2017-02-09'] 
filename_prefix_list = ['2017-02-12_11-45-59', '2017-02-12_11-35-05', '2017-02-10_11-00-52', '2017-02-11_10-59-23', '2017-02-09_09-12-09'] 

my_dict = defaultdict(list) 
for year_month_day in year_month_day_list: 
    for filename_prefix in filename_prefix_list: 
     if filename_prefix.startswith(year_month_day): 
      my_dict[year_month_day].append(filename_prefix) 

在由my_dict值保持將是:

{ 
    '2017-02-09': ['2017-02-09_09-12-09'], 
    '2017-02-10': ['2017-02-10_11-00-52'], 
    '2017-02-12': ['2017-02-12_11-45-59', '2017-02-12_11-35-05'],   
    '2017-02-11': ['2017-02-11_10-59-23'] 
} 

用於訪問dict中的對象Django的模板,你將不得不做這樣的事情:

{% for key, values in my_dict.items %} 
    {{key}} 
    {% for value in values %} 
     {{value}} 
    {% endfor %} 
{% endfor %} 

欲瞭解更多詳情,請參閱:How to access dictionary element in django template?


注:請不要使用dict變量名,因爲dict是內置型蟒蛇。

+0

我欣賞關於不使用'dict'作爲變量的建議。 Noob錯誤:) – brewcrazy