我想对两个列表的列表进行排序,其中两个列表中的元素是对。
我想通过这些对中的第二个元素对列表进行排序。
例如,如果我有
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))))
祝你好运, 奥伊斯坦
答案 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]]