对列表进行排序

时间:2018-01-09 06:20:27

标签: python sorting

所以我有一个如下列表:

points = [[0, 0], [5, 3], [0, 5], [0, 2], [1, 3], [5, 3]]

我一直在使用

points.sort(key=lambda pair: pair[0])

对列表进行排序。但是这只是在不看第二个值的情况下按第一个值排序。

此代码的结果如下:

[[0, 0], [0, 5], [0, 2], [1, 3], [5, 3], [5, 3]]

但是,我想排序的结果是:

[[0, 0], [0, 2], [0, 5], [1, 3], [5, 3], [5, 3]]

我该怎么做?

此外,虽然我们在此,但如何从此列表中删除重复项?最终结果应该是:

[[0, 0], [0, 2], [0, 5], [1, 3], [5, 3]]

4 个答案:

答案 0 :(得分:5)

Python已经按字典顺序对可迭代容器(元组,列表,...)和字符串进行排序。

>>> points = [[0, 0], [5, 3], [0, 5], [0, 2], [1, 3], [5, 3]]
>>> sorted(points)
[[0, 0], [0, 2], [0, 5], [1, 3], [5, 3], [5, 3]]

答案 1 :(得分:1)

您可以拥有一个首先按第一个元素x[0]排序的排序键,如果它们是关系,则按第二个元素x[1]排序:

>>> points = [[0, 0], [5, 3], [0, 5], [0, 2], [1, 3], [5, 3], [0, 4]]
>>> sorted(points, key = lambda x: (x[0], x[1]))
[[0, 0], [0, 2], [0, 4], [0, 5], [1, 3], [5, 3], [5, 3]]

如果您不想在此最终列表中找到任何重复项,那么您可以这样做:

points = [[0, 0], [5, 3], [0, 5], [0, 2], [1, 3], [5, 3]]

sorted_lst = sorted(points, key = lambda x: (x[0], x[1]))

seen = set()
no_dups = []
for lst in sorted_lst:
    curr = tuple(lst)
    if curr not in seen:
        no_dups.append(lst)
        seen.add(curr)

print(no_dups)
# [[0, 0], [0, 2], [0, 5], [1, 3], [5, 3]]

其中有一组seen用于跟踪已添加的子列表,以及列表no_dups,其中列表已添加。如果某个元素不在seen中并将其添加到最终列表中,则将其添加到seen,这表示该元素已添加。

此外,由于类型list不是可散列类型,因此无法将它们直接添加到集合中。在上面的代码中,列表将转换为元组并添加到seen,这是一个可哈希类型。

答案 2 :(得分:1)

import itertools

points = [[0, 0], [5, 3], [0, 5], [0, 2], [1, 3], [5, 3]]
points.sort()
nList = list(points for points,_ in itertools.groupby(points))
print nList

结果:

[[0, 0], [0, 2], [0, 5], [1, 3], [5, 3]]

答案 3 :(得分:0)

尝试itemgetter

from operator import itemgetter
sorted(points, key=itemgetter(0, 1))