【发布时间】:2021-06-13 06:20:58
【问题描述】:
我有一个整数列表。现在我想从中间排序。我的意思是:
- 如果列表长度为奇数,则从中间的数字开始;
- 如果列表长度为偶数,则从中间两个数字中较大的一个开始;
- 交替取左右(或左右,取决于它们的大小)的数字。总是先取两者中的较大者。
我设法编写了以下代码,但仅适用于奇数大小的列表。为此编写一个均匀的版本并不难,但我觉得必须有更通用和“Pythonic”的方式来编码。我真的很惊讶这个微不足道的问题以前从未被问过。
# Odd length, works
lst = [1, 3, 5, 7, 9, 10, 8, 6, 4, 2, 0] # Expected output [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# Even length, doesn't work
#lst = [1, 3, 5, 7, 9, 8, 6, 4, 2, 0] # Expected output [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
mid = len(lst) // 2
dist = 1
res = [lst[mid]]
while dist <= mid:
res += sorted([lst[mid - dist], lst[mid + dist]], reverse=True)
dist += 1
assert len(res) == len(lst)
print(res)
请注意,第一个数字之后的序列必须遵循距离 +-1, +-2, +-3, ...
例如[5, 4, 3, 2, 1]的预期输出为[3, 4, 2, 5, 1]; [5, 3, 1, 0, 2, 4] 的预期输出是 [1, 0, 3, 2, 5, 4]
另外,如果有人能给函数提供reverse=True或False的选项,那就太好了,这样用户就可以决定是先选择更大的数字还是先选择更小的数字。
【问题讨论】:
-
我不明白问题 - 在这两个例子中,预期结果都可以通过简单的
sorterd(list, revesed=True) -
不明白的看底部的两个例子
-
也许你应该把每个部分单独排序,然后加入他们
sorted(left) + sorted(right) -
好的。为了避免误解,我删除了分发的描述。我需要一个适用于随机整数列表的代码。
-
似乎涉及
heapq.merge(..., reverse=True)、lst[:mid]和lst[mid:]的东西应该可以工作。
标签: python list sorting sequence