为什么列表中的元素不是同一结构?

问题描述

我有这个查询

ranges = AgeRange.objects.all().order_by("id")
ranges_list = [{item.id,item.frm_to } for item in ranges]

我得到了这个结果:

[{1,'1-6'},{2,'1-18'},{3,'1-40'},{'40-60',4},{5,'60-100'}]

我无法弄清楚为什么第四项 {'40-60',4} 的元素是相反的。如何确保剩下的ID?

解决方法

Python doc

set对象是不同散列对象的 “无序” 集合。

元素 {2,'1-18'} Python set 对象,它没有任何 订购

您可以通过 print(type({2,'1-18'})) 检查元素的类型,显然可以打印出set

为确保ID优先,请使用 元组 而不是 set

ranges_list = [(item.id,item.frm_to) for item in ranges]
,

花括号用于声明集合,而集合是无序的。巧合的是,它仅影响您的一项。

最简单的解决方法是使用括号而不是集合来创建元组,更好的解决方法是,如果确实只需要这两个字段,则首先使用values_list查询:

ranges_list = [(item.id,item.frm_to) for item in ranges]

或:

ranges_list = AgeRange.objects.all().order_by("id").values_list("id","frm_to")

在最后一种情况下,您不需要ranges查询。 它会返回一个可迭代的查询集结果,而不是列表-如果您确实确实需要一个列表,只需在其上调用list()构造函数即可:

ranges_list = list(AgeRangeobjects.all().order_by("id").values_list("id","frm_to"))