2017-02-12 3 views
0

Ich habe 2 Listen:erstellen Wörterbuch von 2 Listen, verwenden Sie in django Vorlage

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'] 

Wenn ich alle Dateinamen greifen, die ihre zugehörigen ymd entsprechen:

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) 

Wie kann ich ein Wörterbuch, das den Schlüssel unique_day und die zugehörigen Dateinamen für diesen Tag als Werte verwendet?

Ausgabe sollte so etwas wie:

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']} 

Dann, wie kann ich die in meiner Vorlage verwenden? Etwas wie:

<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> 

Antwort

2

Sie itertools.groupby zu einer Gruppe von ihren Daten, um die Listenelemente verwenden können. Das Datum kann von datetime Zeichenfolgen geschnitten werden und als Gruppierung Schlüssel verwendet werden. Sie können sorted fallen, wenn die Datetime Strings bereits Daten gruppiert sind:

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']} 

Um das Wörterbuch in Ihrer Vorlage verwenden sie einfach auf den aktuellen Kontext über Ihre Ansicht Funktion übergeben, und erhalten ihre Schlüssel-Wert-Paare durch Aufruf seiner items Methode mit {% for k, v in dct.items %}.

Allgemeiner:

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

Es sieht so aus, als ob das gut funktioniert. Ich möchte jedoch, dass die Ergebnisse in absteigender Reihenfolge für den Schlüssel und die Werteliste zurückgegeben werden. Grundsätzlich möchte ich den letzten Tag, dann seine Dateien mit der neuesten Datei zuerst. Können Sie mir vorschlagen, wie ich das erreichen kann? Sort() auf dct entfernt die Werte. – brewcrazy

+0

Übergeben Sie 'reverse = True' an' sorted' und speichern Sie das Ergebnis in 'collections.OrderedDict' –

+0

Welches Ergebnis speichere ich in' collections.OrderedDict'? Das habe ich jetzt: 'dct = {k: list (g) für k, g in groupby ( sortiert (sortierte_Dateiname_liste, rückwärts = Wahr), Lambda x: x [: 10])}' – brewcrazy

0

Für die Listen in das gewünschte Format konvertieren dict, können Sie verwenden collections.defaultdict als:

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) 

wo Wert halten, durch my_dict wird:

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

Für den Zugriff auf dict Objekte in Django-Vorlage, werden Sie so etwas wie zu tun haben:

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

Für weitere Einzelheiten siehe: How to access dictionary element in django template?


Hinweis: nicht seit dictdict als Variablennamen verwenden Sie ist eine eingebaute Art in Python.

+0

Ich schätze den Ratschlag, 'dict' nicht als Variable zu verwenden. Noob Fehler :) – brewcrazy

Verwandte Themen