在Python中对由一个列表索引的列表列表进行排序的简单方法

时间:2014-06-27 08:24:47

标签: python sorting

我想对两个列表的列表进行排序,其中两个列表中的元素是对。

我想通过这些对中的第二个元素对列表进行排序。

例如,如果我有

a_list = [[51132, 55274, 58132], [190, 140, 180]]

并希望

sorted_list = [[55274, 58132, 51132], [140, 180, 190]]

在Python2.7中是否有比以下更简单的方法?

from operator import itemgetter
sorted_list = map(list, zip(*sorted(map(list,zip(*a_list)), key=itemgetter(1))))

祝你好运, 奥伊斯坦

2 个答案:

答案 0 :(得分:2)

我有点不愿意将此作为答案发布,但为什么不呢,实际上呢?

不,没有更简单的方法可以在Python中实现排序 - 除了你可以放弃内部map

>>> map(list, zip(*sorted(zip(*a_list), key=itemgetter(1))))
[[55274, 58132, 51132], [140, 180, 190]]

起初看起来有点复杂(虽然没有 那个额外的map),但实际上它非常清楚:你 zip < / em>列表,第二个元素排序 zip 返回。每个了解Python的人都应该了解代码的作用。

如果你想让它更清晰,可以添加描述排序功能的行注释,或者将其包含在具有描述性名称和相同或更广泛注释的函数中。

答案 1 :(得分:1)

根据我的理解,你想要的是根据对的第二个元素对每对进行排序;也就是说,(对)的第二个元素的排序是确定第一个元素的排序。以下代码使用第二个元素的相应位置作为排序键:

编辑:我做了一个修改,应该解决重复元素的问题,谢谢你指出:

class _Value:
    def __init__(self, pos, val):
        self.pos, self.val = pos, val

    def __lt__(self, other):
        return self.val < other.val


a_list = [[51132, 55274, 58132], [190, 140, 180]]
a_list = [[_Value(i, x) for i, x in enumerate(l)] for l in a_list]

sorted_list = [sorted(l, key=lambda x: a_list[1][x.pos]) for l in a_list]
sorted_list = [[x.val for x in l] for l in sorted_list]
assert sorted_list == [[55274, 58132, 51132], [140, 180, 190]]