Python 如何在“中对数组或查询集进行排序”;国际象棋顺序;?

Python 如何在“中对数组或查询集进行排序”;国际象棋顺序;?,python,django,sorting,Python,Django,Sorting,任务是按照“国际象棋顺序”对queryset进行排序。即: Item.objects.all()的所需输出为: [item1, item3, item4, item2, item5] 因此,生成的查询集将按照分支为(1,2,3)、(1,2,3)、(1,2,3)等的方式进行排序。我从未听说过国际象棋排序,但从您的描述来看,它似乎是这样定义的 如果l[0]为xmin并且递归选取l[j]以最小化定义为最小正整数的步长k,使得l[j-1]+k==l[j]mod xmax,则具有最小元素xmin和最大元

任务是按照“国际象棋顺序”对queryset进行排序。即:

Item.objects.all()
的所需输出为:

[item1, item3, item4, item2, item5]

因此,生成的查询集将按照分支为
(1,2,3)、(1,2,3)、(1,2,3)
等的方式进行排序。

我从未听说过国际象棋排序,但从您的描述来看,它似乎是这样定义的

如果
l[0]
为xmin并且递归选取
l[j]
以最小化定义为最小正整数的步长k,使得
l[j-1]+k==l[j]
mod xmax,则具有最小元素xmin和最大元素xmax的列表l按国际象棋排序顺序排列

换句话说,这就像你只允许将与它们的值对应的项目放在棋盘上。如果在棋盘上尽可能早地定位每个元素,则认为该列表已排序

这种排序的问题在于它不是本地的。这意味着,每个项相对于其相邻项正确放置并不意味着整个列表已正确排序。这很重要,因为它表明我们将无法使用
sorted
和精心编制的
key
参数对列表进行排序

尽管如此,我们可以编写一个类似于按国际象棋顺序排序的算法

代码 例子 输出 适用于你的问题 注意我是如何允许将
传递到
chess\u sort
?您可以像对
sorted
那样使用它来按
分支
属性对项目进行排序

chess_sort(Item.objects.all(), key=lambda x: x.branch)

我从来没有听说过象棋,但从你的描述来看,它似乎是这样定义的

如果
l[0]
为xmin并且递归选取
l[j]
以最小化定义为最小正整数的步长k,使得
l[j-1]+k==l[j]
mod xmax,则具有最小元素xmin和最大元素xmax的列表l按国际象棋排序顺序排列

换句话说,就好像你只被允许在一个棋盘上对应于其值的列上放置项目。如果在棋盘上尽可能早地定位每个元素,则认为该列表已排序

这种排序的问题在于它不是本地的。这意味着,每个项相对于其相邻项正确放置并不意味着整个列表已正确排序。这很重要,因为它表明我们将无法使用
sorted
和精心编制的
key
参数对列表进行排序

尽管如此,我们可以编写一个类似于按国际象棋顺序排序的算法

代码 例子 输出 适用于你的问题 注意我是如何允许将
传递到
chess\u sort
?您可以像对
sorted
那样使用它来按
分支
属性对项目进行排序

chess_sort(Item.objects.all(), key=lambda x: x.branch)

你有什么“国际象棋顺序”的更多信息吗?请提供一个关于这个“国际象棋顺序”的链接。我很好奇。如果你有一堆黑白元素,你应该按照类似于棋盘的顺序来组织它们:黑白黑白…等等。你有更多关于什么是“国际象棋顺序”的信息吗?请提供关于这个“国际象棋顺序”的链接。我很好奇。如果你有一堆黑白元素,你应该按照类似于棋盘的顺序来组织它们:黑白…etcI认为你已经解决了比你被要求解决的更多的问题:你实际上给出了一个有意义的“国际象棋排序”公式,以获得操作荣誉!谢谢我想我会花一些时间来理解它是如何工作的。但它确实有效@用户1537546如果需要,不要害羞地问。干杯此方法中唯一的错误是它反转初始数组。因此,lst[:-1]:count[key(x)]中的x应该是
。append(x)
@diveru4i我使用pop()弹出O(1),但是如果顺序重要,请使用出列查看更新的解决方案。dequeue的append和popleft都是O(1)。我想你已经解决了比要求你解决的更多的问题:你实际上给出了一个有意义的“国际象棋排序”公式,以获得OP.荣誉!谢谢我想我会花一些时间来理解它是如何工作的。但它确实有效@用户1537546如果需要,不要害羞地问。干杯此方法中唯一的错误是它反转初始数组。因此,lst[:-1]:count[key(x)]中的x应该是
。append(x)
@diveru4i我使用pop()弹出O(1),但是如果顺序重要,请使用出列查看更新的解决方案。dequeue的append和popleft都是O(1)
import random

lst = random.choices(range(5), k=15)

print('list:', lst)
print('sorted:', chess_sort(lst))
list: [0, 1, 4, 2, 1, 2, 1, 3, 4, 3, 0, 0, 0, 3, 2]
sorted: [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 0]
chess_sort(Item.objects.all(), key=lambda x: x.branch)