【问题标题】:insert items to dictionary with reverse forloop (django)使用反向forloop(django)将项目插入字典
【发布时间】:2014-02-12 09:26:24
【问题描述】:

所以我已经初始化了一个循环遍历一系列对象,其中范围从 1 开始并以模型具有的最大字段数结束

for count in range(1, len(field_list)):
    f_val = getattr(instance, field_list[count])
    field_values[field_list[count]] = f_val
    print "field_values: ", field_values            

f_val 变量使用model_instance.field_name 计算字段值,并将字段名称和字段值作为键值对插入“field_values”字典中。当我打印field_values 时,我得到:

field_values:  {'descr': u'ggg'}
field_values:  {'descr_en': u'sg', 'descr': u'ggg'}
field_values:  {'notes': u'ddddf', 'descr_en': u'sg', 'descr': u'ggg'}

所以我现在要做的是反转键值对的顺序,这样我就有{'descr': u'ggg', 'descr_en': u'sg', 'notes': u'ddddf'}。因此,我在初始循环(for count in reversed(range(1, len(field_list))):)中使用了reversed(),但我的字典虽然以最后一个键值对而不是第一个键值对开头,但最终输出与开始时相同。

field_values:  {'notes': u'ddddf'}
field_values:  {'notes': u'ddddf', 'descr_en': u'sg'}
field_values:  {'notes': u'ddddf', 'descr_en': u'sg', 'descr': u'ggg'}

所以我想知道为什么会这样?默认情况下它会对我的字典进行排序吗?如果这种方法不起作用,我还能遵循哪些其他方法?

【问题讨论】:

  • 字典键是无序的

标签: python django data-structures dictionary


【解决方案1】:

字典是按其键 (documentation found here) 索引的无序 数据类型,因此向 dict 添加键的顺序无关紧要。

sorting a dictionary by valuesorting a dictionary by key 上使用OrderedDict 有一些很好的问题。

【讨论】:

  • 虽然除了美学之外你为什么要这样做(浪费计算能力IMO)我不知道......
  • 我在 django 中执行此操作,并且我有很多具有很多字段的模型,因此我想在我的模板中以有序的方式呈现所有内容。所以是的,你可以说这是为了组织的美学……帮助用户更快地识别字段。
  • 无论如何,您提供的答案真的很有帮助!非常感谢!
  • 啊,这更有意义@per7inac1ousQ。您可以做的一件事实际上是返回这个无序的,然后使用 Javascript 在客户端对其进行排序(参见 this question 关于排序对象)。这具有用户可以通过其他键订购的能力(例如,如果它在表中或类似的地方)。只是一个想法......
  • 确实是个好主意,将部分处理移到客户端,从而提高性能。但是,我更关心数据的可靠性(JavaScript 在这方面不是很可靠),所以我会在稍后的阶段看到我将实现这种方法的扩展范围。
【解决方案2】:

字典是无序的,所以无论你在其中插入项目的顺序是什么。

标准库也有一个有序版本的字典,collections.OrderedDict。也许你可以使用它。

【讨论】:

    猜你喜欢
    • 2013-09-02
    • 2019-08-23
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2011-08-07
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多