【问题标题】:Dict of dict issue in djangodjango中的dict问题
【发布时间】:2011-09-20 23:58:06
【问题描述】:

我在 django 模板中生成 dict 时遇到了奇怪的问题。

data = [{'hrs': 9.0, 'ld': u'pname', 'dn': u'TS', 'ist': u'TS', 'act': u'O', 'date': datetime.date(2011, 9, 19), 'id': 1119556},
 {'hrs': 9.0, 'ld': u'pname', 'dn': u'TS', 'ist': u'TS', 'act': u'Ti', 'date': datetime.date(2011, 9, 21), 'id': 1119558},
 {'hrs': 2.5, 'ld': u'pname', 'dn': u'TS', 'ist': u'dmin', 'act': u'POC', 'date': datetime.date(2011, 9, 20), 'id': 1119577},
 {'hrs': 0.5, 'ld': u'pname', 'dn': u'SMgr', 'ist': u'SMgr', 'act': u'PL', 'date': datetime.date(2011, 9, 20), 'id': 1119578},
 {'hrs': 2.0, 'ld': u'pname', 'dn': u'SMgr', 'ist': u'TS', 'act': u'Mting', 'date': datetime.date(2011, 9, 20), 'id': 1119579},
 {'hrs': 8.0, 'ld': u'sname', 'dn': u'holiday', 'ist': u'holiday', 'act': u'PL', 'date': datetime.date(2011, 9, 19), 'id': 1119455},
 {'hrs': 8.0, 'ld': u'sname', 'dn': u'holiday', 'ist': u'holiday', 'act': u'PL', 'date': datetime.date(2011, 9, 21), 'id': 1119457}, 
 {'hrs': 1.0, 'ld': u'sname', 'dn': u'TS', 'ist': u'TS', 'act': u'O', 'date': datetime.date(2011, 9, 20), 'id': 1119566},
 {'hrs': 7.0, 'ld': u'sname', 'dn': u'PD', 'ist': u'PD', 'act': u'LOP', 'date': datetime.date(2011, 9, 20), 'id': 1119567}]

使用这个dict列表写在下面的逻辑

results = collections.defaultdict(dict)

for fetch in data:
    user = fetch['ld']
    get_id = fetch['id']
    adata = '%s/%s/%s/%s' % (fetch['dn'], fetch['ist'], fetch['act'], fetch['hrs'])
    row = results[user]
    row['user'] = user
    dt = str(fetch['date'])
    row[dt] = adata

这给了我下面的输出

结果:

 {u'sname': {'2011-09-21': u'holiday/holiday/PL/8.0', '2011-09-20': u'PD/PD/LOP/7.0', 'user': u'sname', '2011-09-19': u'holiday/holiday/PL/8.0'},
 u'pname': {'2011-09-21': u'TS/TS/Ti/9.0', '2011-09-20': u'SMgr/TS/Mting/2.0', 'user': u'pname', '2011-09-19': u'TS/TS/O/9.0'}}

一般我需要得到低于输出,但 dict 的 dict 只打印日期键值而不是同一日期的多个键值

预期输出:

{u'sname': {'2011-09-21': u'holiday/holiday/PL/8.0', '2011-09-20': u'TS/TS/O/1.0', '2011-09-20': u'PD/PD/LOP/7.0', 'user': u'sname', '2011-09-19': u'holiday/holiday/PL/8.0'}, 
u'pname': {'2011-09-21': u'TS/TS/Trickle/9.0', '2011-09-20': u'TS/dmin/POC/2.5', '2011-09-20': u'SMgr/Smgr/PL/0.5', '2011-09-20': u'SMgr/TS/Mting/2.0' 'user': u'pname', '2011-09-19': u'TechSupport/TechSupport/O/9.0'}}

我使用下面的模板标签来散列表格

模板

@register.filter
def hash(object, attr):
  gen_context = { 'object' : object }
  try:
    value = template.Variable('object.%s' % attr).resolve(gen_context)
  except template.VariableDoesNotExist:
    value = ' '
  return value

HTML:

<table>
   <thead>
   <th>S.No</th>
   <th>Name</th>
  {% for dates in week_dates %}
   <th>{{dates}}</th>
   {% endfor %}
  </thead>
    <tr>
{% for fetch in data.items %}
 <tr>
 <td>{{ forloop.counter }}</td>
 <td>{{ fetch.0 }}</td>
 {% for dates in week_dates %}
 <td>{{ fetch.1|hash:dates }}</td>
{% endfor %}                                          
 </tr>
 {% endfor %}
 </table>

任何帮助都非常感谢。

如果您需要更多信息,请告诉我。

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    正如教程至少一次中所述,字典键是唯一的。如果你想为一个键设置多个值,那么你必须用一个序列来伪造它。

    {'foo': ['bar', 42]}
    

    【讨论】:

    • 能帮我怎么做吗?
    • 你有没有看我的例子?
    • 明白了这一点,但只是想知道如何用序列来伪造它。很抱歉给您带来了困扰。
    • ... 列表总是有用的。只是,你知道,追加。
    • 只需使用 try 和 except KeyError 来实现它...在 except 部分初始化列表并在 try 部分附加到它
    【解决方案2】:

    字典中的同一个键不能有多个值。键必须是不同的。因此,如果您尝试保存日期值对并且日期已经是字典中的键,则其值将被覆盖。因此,您将不得不使用真正唯一的键来更改内部字典的结构。身份证呢?据我所知,您在 get_id 中阅读了它们,但不要使用它们。他们将非常适合这项工作。然后,您可以使用元组将所有内容保存在如下结构中:{id: (date, adata)}

    【讨论】:

      猜你喜欢
      • 2021-03-15
      • 2023-03-16
      • 2023-03-18
      • 2014-12-19
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 2013-10-27
      • 2013-12-28
      相关资源
      最近更新 更多