首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据列表中的多个元素排序列表

根据列表中的多个元素排序列表
EN

Stack Overflow用户
提问于 2017-11-28 17:14:30
回答 2查看 46关注 0票数 1

是否可以根据多个列表元素实现用于排序的python键?

例如:

代码语言:javascript
复制
list = [1, 2, 3, 4]

我希望根据两个元素之间的差异对列表进行排序,以便使增量在它们之间最大化。

预期结果:

代码语言:javascript
复制
list = [1, 4, 2, 3] # delta = 4-1 + 4-2 + 3-2 = 6

其他结果也是可能的,但在原点数组中,1在4之前,所以首先应该取1:

代码语言:javascript
复制
list = [4, 1, 3, 2] # delta = 4-1 + 3-1 + 3-2 = 6

我想使用python sorted,如:

代码语言:javascript
复制
sorted(list, key=lambda e1, e2: abs(e1-e2))  

有可能这样做吗?也许还有另一个可以使用的图书馆。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-28 17:21:34

因为(正如您向我们展示的)可能有多个不同的结果--这意味着这个排序/顺序不是确定性的,因此您不能对其应用关键函数。

也就是说,很容易自己实现排序:

代码语言:javascript
复制
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进行排序来改进它,而不是查找maxmin,我们可以在列表的开头和结尾提取项。通过这样做,我们将降低O(n log(n))的时间复杂度

编辑

根据下面的评论:如果索引起了一定的作用,那么它也不是一个“真正的”排序:),这个解决方案可以设计成首先保持较小的索引,等等:

代码语言:javascript
复制
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]
票数 2
EN

Stack Overflow用户

发布于 2017-11-28 17:21:26

这一解决办法相当野蛮;然而,它仍然有可能:

代码语言:javascript
复制
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])

输出:

代码语言:javascript
复制
((2, 4, 1, 3), 7)

注意,输出的形式是:(list, total_sum))

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47537322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档