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

why the elements of the list is not in the same structure?

我有这个查询集

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

我不明白为什么第 4 项的元素 {'40-60', 4} 是颠倒的。如何保证id在左边?

来自Python doc

A set object is an "unordered" collection of distinct hashable objects.

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

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

为了确保 id 成为第一个,使用 tuple 而不是 set

ranges_list = [<b>(item.id, item.frm_to)</b> 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 查询。 它将 return 一个可迭代的查询集结果而不是一个列表 - 如果你真的需要一个列表,只需调用 list() 构造函数即可:

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