2017-02-12 52 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