是否可以根据多个列表元素实现用于排序的python键?
例如:
list = [1, 2, 3, 4]我希望根据两个元素之间的差异对列表进行排序,以便使增量在它们之间最大化。
预期结果:
list = [1, 4, 2, 3] # delta = 4-1 + 4-2 + 3-2 = 6其他结果也是可能的,但在原点数组中,1在4之前,所以首先应该取1:
list = [4, 1, 3, 2] # delta = 4-1 + 3-1 + 3-2 = 6我想使用python sorted,如:
sorted(list, key=lambda e1, e2: abs(e1-e2)) 有可能这样做吗?也许还有另一个可以使用的图书馆。
发布于 2017-11-28 17:21:34
因为(正如您向我们展示的)可能有多个不同的结果--这意味着这个排序/顺序不是确定性的,因此您不能对其应用关键函数。
也就是说,很容易自己实现排序:
def my_sort(col):
res = []
while col:
_max = max(col)
col.remove(_max)
res.append(_max)
if col:
_min = min(col)
col.remove(_min)
res.append(_min)
return res
print(my_sort([1,2,3,4])) # [4, 1, 3, 2]该解决方案在O(n^2)中运行,但可以通过在开始时对col进行排序来改进它,而不是查找max和min,我们可以在列表的开头和结尾提取项。通过这样做,我们将降低O(n log(n))的时间复杂度
编辑
根据下面的评论:如果索引起了一定的作用,那么它也不是一个“真正的”排序:),这个解决方案可以设计成首先保持较小的索引,等等:
def my_sort(col):
res = []
while col:
_max = max(col)
max_index = col.index(_max)
col.remove(_max)
if col:
_min = min(col)
min_index = col.index(_min)
col.remove(_min)
if max_index < min_index:
res.extend([_max, _min])
else:
res.extend([_min, _max])
continue
res.append((_max))
return res
print(my_sort([1,2,3,4])) # [1, 4, 2, 3]发布于 2017-11-28 17:21:26
这一解决办法相当野蛮;然而,它仍然有可能:
from itertools import permutations
list = [1, 2, 3, 4]
final_list = ((i, sum(abs(i[b]-i[b+1]) for b in range(len(i)-1))) for i in permutations(list, len(list)))
final_lists = max(final_list, key=lambda x:x[-1])输出:
((2, 4, 1, 3), 7)注意,输出的形式是:(list, total_sum))
https://stackoverflow.com/questions/47537322
复制相似问题