按不同值快速排序
QuickSort by different values
你好!我有一个这样的列表列表:
list_ = [["a", 1],
["b", 3],
["c", 2],
["d", 2]]
我想每隔一个元素对它进行一次排序,我可以使用快速排序来做到这一点。
def partition(a, low, high):
i = low - 1
pivot = a[high][1]
for j in range(low, high):
if a[j][1] >= pivot:
i += 1
a[i], a[j] = a[j], a[i]
def quicksort_inplace(a, low=0, high=None):
if high is None:
high = len(a) - 1
if low < high:
p_idx = partition(a, low, high)
quicksort_inplace(a, low, p_idx - 1)
quicksort_inplace(a, p_idx + 1, high)
return a
问题。我知道如何一次对一个项目进行排序,但我不明白如何对我的列表进行排序,以便如果有相同的项目,则按字母顺序(第一个项目)进行排序。
在:
[
["a", 1],
["b", 3],
["c", 2],
["d", 2]
]
输出:
[
["b", 3],
["d", 2]
["c", 2],
["a", 1],
]
您可以调整您的枢轴值和比较函数来执行您想要的任何逻辑,但是,在大多数情况下,您希望执行“lexographic”顺序。
幸运的是,python 已经用列表和元组为您实现了这个逻辑,比较第一个元素,如果相等,则转到下一个,然后再确定哪个更大。
正在使用
pivot = a[high]
...
if a[j] < pivot:
会先比较字符串,再比较数字。但是,您想要其他顺序,并且最重要的是,您想要颠倒数字。
最简单的方法就是创建这样一个 key
您可以对其进行排序。
pivot = (-a[high][1], a[high][0]) # reversed number first, then ordinary letter.
...
if (-a[j][1], a[j][0]) < pivot:
当然我们也可以在正常的排序过程中使用key
sorted(list_, key=lambda x: (-x[1], x[0]))
list_.sort(key=lambda x: (-x[1], x[0]))
你好!我有一个这样的列表列表:
list_ = [["a", 1],
["b", 3],
["c", 2],
["d", 2]]
我想每隔一个元素对它进行一次排序,我可以使用快速排序来做到这一点。
def partition(a, low, high):
i = low - 1
pivot = a[high][1]
for j in range(low, high):
if a[j][1] >= pivot:
i += 1
a[i], a[j] = a[j], a[i]
def quicksort_inplace(a, low=0, high=None):
if high is None:
high = len(a) - 1
if low < high:
p_idx = partition(a, low, high)
quicksort_inplace(a, low, p_idx - 1)
quicksort_inplace(a, p_idx + 1, high)
return a
问题。我知道如何一次对一个项目进行排序,但我不明白如何对我的列表进行排序,以便如果有相同的项目,则按字母顺序(第一个项目)进行排序。
在:
[
["a", 1],
["b", 3],
["c", 2],
["d", 2]
]
输出:
[
["b", 3],
["d", 2]
["c", 2],
["a", 1],
]
您可以调整您的枢轴值和比较函数来执行您想要的任何逻辑,但是,在大多数情况下,您希望执行“lexographic”顺序。 幸运的是,python 已经用列表和元组为您实现了这个逻辑,比较第一个元素,如果相等,则转到下一个,然后再确定哪个更大。
正在使用
pivot = a[high]
...
if a[j] < pivot:
会先比较字符串,再比较数字。但是,您想要其他顺序,并且最重要的是,您想要颠倒数字。
最简单的方法就是创建这样一个 key
您可以对其进行排序。
pivot = (-a[high][1], a[high][0]) # reversed number first, then ordinary letter.
...
if (-a[j][1], a[j][0]) < pivot:
当然我们也可以在正常的排序过程中使用key
sorted(list_, key=lambda x: (-x[1], x[0]))
list_.sort(key=lambda x: (-x[1], x[0]))